общение с socket.io от андроида - PullRequest
9 голосов
/ 20 марта 2012

Краткое описание проблемы

Я пытаюсь объединить простое приложение чата socket.io в собственное приложение для запуска на Android 2.2 и более поздних версиях с помощью phonegap.

веб-клиент socket.io -> сервер socket.io работает

У меня есть простой сервер, работающий с socket.io, который успешно взаимодействует с клиентом socket.io при его запуске в веб-браузере.

мобильный клиент socket.io в мобильном браузере -> сервер socket.io работает

Обратите внимание, что , поскольку веб-сокеты не поддерживаются на Android 2.2 , по умолчанию используется опрос xhr, примеры сообщений с сервера при подключении через веб-браузер на Android 2.2. [root@webnode-2 nodechat]# node server.js info - socket.io started debug - client authorized info - handshake authorized 6036976111002307981 debug - setting request GET /socket.io/1/xhr-polling/6036976111002307981?t=1332184313758 debug - setting poll timeout debug - client authorized for debug - clearing poll timeout debug - xhr-polling writing 1:: debug - set close timeout for client 6036976111002307981 6036976111002307981 debug - setting request GET /socket.io/1/xhr-polling/6036976111002307981?t=1332184313839 debug - setting poll timeout debug - clearing poll timeout debug - xhr-polling writing 5:::{"name":"message","args":["Welcome stranger!"]} debug - set close timeout for client 6036976111002307981 debug - discarding transport debug - cleared close timeout for client 6036976111002307981 debug - setting request GET /socket.io/1/xhr-polling/6036976111002307981?t=1332184313928 debug - setting poll timeout debug - discarding transport debug - cleared close timeout for client 6036976111002307981 debug - clearing poll timeout debug - xhr-polling writing 8:: debug - set close timeout for client 6036976111002307981 debug - xhr-polling closed due to exceeded duration debug - setting request GET /socket.io/1/xhr-polling/6036976111002307981?t=1332184334139 debug - setting poll timeout debug - discarding transport debug - cleared close timeout for client 6036976111002307981 debug - xhr-polling received data packet 5:::{"name":"connect_friends","args":[{"user_id":"2","friends_list":[1,2,3,4,5,6,7,8,9,10]}]}</p> <hr> <p>REGISTER USER</p> <hr> <p>{ user_id: '2', friends_list: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] } 10 assigned user_id: 2 to socket 6036976111002307981

socket.io из phonegap -> сервер socket.io не работает

Однако когда я пытаюсь соединиться с socket.io в phonegap, соединение открывается, но быстро закрывается

В журнале Android есть ошибка о том, что требуется flash player> v10, но в моем телефоне есть flash player v 11.1 03-19 11:38:46.847: I/PhoneGapLog(18469): Found log level DEBUG 03-19 11:38:46.847: I/PhoneGapLog(18469): Changing log level to DEBUG(3) 03-19 11:38:46.847: D/DroidGap(18469): DroidGap.onCreate() 03-19 11:38:46.847: D/DroidGap(18469): DroidGap.loadUrl(file:///android_asset/www/index.html) 03-19 11:38:46.847: D/DroidGap(18469): DroidGap: url=file:///android_asset/www/index.html baseUrl=file:///android_asset/www/ 03-19 11:38:46.847: D/DroidGap(18469): DroidGap.init() 03-19 11:38:46.941: D/dalvikvm(18469): GC_FOR_MALLOC freed 6234 objects / 618952 bytes in 68ms 03-19 11:38:46.968: D/SoftKeyboardDetect(18469): Ignore this event 03-19 11:38:47.007: D/SoftKeyboardDetect(18469): Ignore this event 03-19 11:38:47.058: D/SoftKeyboardDetect(18469): Ignore this event</p> <p><b><i>03-19 11:38:47.241: D/PhoneGapLog(18469): Flash Player >= 10.0.0 is required. 03-19 11:38:47.241: D/PhoneGapLog(18469): file:///android_asset/www/js/socket.io/socket.io.js: Line 2622 : Flash Player >= 10.0.0 is required. 03-19 11:38:47.241: E/Web Console(18469): Flash Player >= 10.0.0 is required. at file:///android_asset/www/js/socket.io/socket.io.js:2622</i></b></p> <p>03-19 11:38:47.796: D/PhoneGapLog(18469): Receiving Welcome stranger! 03-19 11:38:47.796: D/PhoneGapLog(18469): file:///android_asset/www/index.html: Line 8 : Receiving Welcome stranger! 03-19 11:38:47.796: I/Web Console(18469): Receiving Welcome stranger! at file:///android_asset/www/index.html:8 03-19 11:39:07.007: E/DroidGap(18469): DroidGap: TIMEOUT ERROR! - calling webViewClient 03-19 11:39:07.007: D/Cordova(18469): DroidGap: GapViewClient.onReceivedError: Error code=-6 Description=The connection to the server was unsuccessful. URL=file:///android_asset/www/index.html 03-19 11:39:07.167: D/SoftKeyboardDetect(18469): Ignore this event 03-19 11:39:16.323: D/dalvikvm(18469): GC_EXPLICIT freed 6130 objects / 505920 bytes in 156ms

Журнал событий на сервере [root@webnode-2 nodechat]# node server.js info - socket.io started debug - client authorized info - handshake authorized 1009349893764580916 debug - setting request GET /socket.io/1/xhr-polling/1009349893764580916?t=1332182327502 debug - setting poll timeout debug - client authorized for debug - clearing poll timeout debug - xhr-polling writing 1:: debug - set close timeout for client 1009349893764580916 debug - setting request GET /socket.io/1/xhr-polling/1009349893764580916?t=1332182327602 debug - setting poll timeout debug - clearing poll timeout debug - xhr-polling writing 5:::{"name":"message","args":["Welcome stranger!"]} debug - set close timeout for client 1009349893764580916 debug - discarding transport debug - cleared close timeout for client 1009349893764580916 debug - setting request GET /socket.io/1/xhr-polling/1009349893764580916?t=1332182327802 debug - setting poll timeout debug - discarding transport debug - cleared close timeout for client 1009349893764580916 debug - clearing poll timeout info - transport end debug - set close timeout for client 1009349893764580916 debug - cleared close timeout for client 1009349893764580916</p> <hr> <p>DISCONNECTED EVENT</p> <hr> <p>debug - discarding transport debug - client authorized info - handshake authorized 2044675477593417130 debug - setting request GET /socket.io/1/xhr-polling/2044675477593417130?t=1332182347938 debug - setting poll timeout debug - client authorized for debug - clearing poll timeout debug - xhr-polling writing 1:: debug - set close timeout for client 2044675477593417130 debug - setting request GET /socket.io/1/xhr-polling/2044675477593417130?t=1332182348112 debug - setting poll timeout debug - clearing poll timeout debug - xhr-polling writing 5:::{"name":"message","args":["Welcome stranger!"]} debug - set close timeout for client 2044675477593417130 debug - discarding transport debug - cleared close timeout for client 2044675477593417130 debug - setting request GET /socket.io/1/xhr-polling/2044675477593417130?t=1332182348308 debug - setting poll timeout debug - discarding transport debug - cleared close timeout for client 2044675477593417130 debug - clearing poll timeout info - transport end debug - set close timeout for client 2044675477593417130 debug - cleared close timeout for client 2044675477593417130</p> <hr> <p>DISCONNECTED EVENT</p> <hr> <p>debug - discarding transport

Сообщение с сервера "Добро пожаловать, незнакомец!" получил по телефону. На телефоне появилось диалоговое окно с сообщением об ошибке приложения. Соединение с сервером было неудачным. (Файл: ///android_asset/www/index.html)

клиент пробелов в телефоне -> сервер socket.io не работает

Затем я прочитал, что веб-сокеты еще не поддерживаются в phonegap, и наткнулся на этот проект для поддержки WebSocket в приложениях Android Phonegap . Когда я запустил его и попытался подключиться к серверу socket.io, я получил ошибку

[root@webnode-2 nodechat]# node server.js info - socket.io started debug - destroying non-socket.io upgrade

, что, по моему мнению, связано с попыткой подключения к серверу socket.io с помощью веб-сокетов без использования клиента socket.io js . Я протестировал его только с сервером node.js, и он работал

Вопросы

  1. Есть ли способ сообщить socket.io о веб-сокете, созданном с помощью Поддержка WebSocket в приложениях Android Phonegap ?
  2. Почему время ожидания опроса xhr истекло?

Ответы [ 2 ]

1 голос
/ 27 июня 2012

1 - Socket.io добавляет еще один слой поверх websocket (например, добавляет сердцебиение).Соединение со сторонней библиотекой не будет принято сервером (сообщение об уничтожении обновления non-socket.io указывает на это).Я еще не нашел / не использовал решение, и я вполне могу изменить код ObjectiveC телефонной пробки для загрузки внешнего URL вместо использования локального ресурса, чтобы избежать этой проблемы: Socket.io + PhoneGap .

2 - опрос - это уловка, когда клиент подключается к серверу, как если бы он хотел загрузить страницу.Но сервер не предоставляет страницу, он записывает сообщения, когда они приходят, имитируя сокетное соединение.Однако стек протоколов (http-сторона браузера, если я все понял?) Не допускает бесконечного соединения.Это нарушит связь, сделав тайм-аут.Клиент socket.io затем повторно установит новое соединение, пока оно снова не истечет.Поэтому периодические тайм-ауты каждые 30 секунд - это нормальное поведение.Если соединение разрывается мгновенно, это может быть причиной возникновения доступа, но я не уверен.

1 голос
/ 12 июня 2012

Вам нужно будет посмотреть ваши HTTP заголовки.Я предполагаю, что клиентская сторона либо не отправляет keep keep, либо игнорируется сервером.Найдите «Connection: keep-alive» в запросе XHR, отправленном клиентом.Также посмотрите на ответы со стороны сервера.Другим индикатором может быть отправленная версия http. 1.0 будет означать, что соединение должно быть закрыто после запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...