Тайм-аут клиента веб-обозревателя Android

Спасибо за прочтение!

Предпосылки: Я разрабатываю клиент Android для сервера, где это требование является приложением, которое требует непрерывного обмена сообщениями взад и вперед с сервером на основе WebSockets .

Реализация. Для клиента я использую клиентскую библиотеку WebSocket для Weberknecht для Android, а сервер – Tornado .

Проблема: На данный момент я initWebSocketClient в onCreate , AsyncTask . Но я продолжаю получать исключение тайм-аута клиента.

Клиент Android:

 private void initWebSocketClient() { Log.e(TAG, "initWebSocketClient"); try { URI url = new URI("ws://192.168.207.84:8080/"); WebSocket websocket = new WebSocketConnection(url); // Register Event Handlers websocket.setEventHandler(new WebSocketEventHandler() { public void onOpen() { Log.e(TAG, "--open"); } public void onMessage(WebSocketMessage message) { Log.e(TAG, "--received message: " + message.getText()); } public void onClose() { Log.e(TAG, "--close"); } }); // Establish WebSocket Connection websocket.connect(); // Send UTF-8 Text websocket.send("hello world"); // Close WebSocket Connection websocket.close(); } catch (WebSocketException wse) { wse.printStackTrace(); } catch (URISyntaxException use) { use.printStackTrace(); } } 

Сервер Tornado:

 #!/usr/bin/env python import tornado.ioloop import tornado.web import tornado.websocket class EchoWebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print "WebSocket opened" def on_message(self, message): self.write_message(u"You said: " + message) def on_close(self): print "WebSocket closed" application = tornado.web.Application([ (r"/", EchoWebSocketHandler), ]) if __name__ == "__main__": application.listen(8080) tornado.ioloop.IOLoop.instance().start() 

Исключение таймаута клиента:

 01-31 19:28:01.367: W/System.err(5668): de.roderick.weberknecht.WebSocketException: error while creating socket to ws://192.168.207.84:8080/ 01-31 19:28:01.386: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:244) 01-31 19:28:01.386: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.connect(WebSocketConnection.java:83) 01-31 19:28:01.386: W/System.err(5668): at com.sagar.websockclient.MainActivity.initWebSocketClient(MainActivity.java:55) 01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity.access$0(MainActivity.java:30) 01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity$WebSocketTask.doInBackground(MainActivity.java:75) 01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity$WebSocketTask.doInBackground(MainActivity.java:1) 01-31 19:28:01.390: W/System.err(5668): at android.os.AsyncTask$2.call(AsyncTask.java:264) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 01-31 19:28:01.390: W/System.err(5668): at java.lang.Thread.run(Thread.java:856) 01-31 19:28:01.390: W/System.err(5668): Caused by: java.net.ConnectException: failed to connect to /192.168.207.84 (port 8080): connect failed: ETIMEDOUT (Connection timed out) 01-31 19:28:01.390: W/System.err(5668): at libcore.io.IoBridge.connect(IoBridge.java:114) 01-31 19:28:01.394: W/System.err(5668): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 01-31 19:28:01.394: W/System.err(5668): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.startupSocket(Socket.java:566) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.tryAllAddresses(Socket.java:127) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.(Socket.java:177) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.(Socket.java:149) 01-31 19:28:01.394: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:238) 01-31 19:28:01.394: W/System.err(5668): ... 11 more 01-31 19:28:01.394: W/System.err(5668): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.Posix.connect(Native Method) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.IoBridge.connect(IoBridge.java:112) 01-31 19:28:01.398: W/System.err(5668): ... 18 more 

Может кто-нибудь, пожалуйста, помогите мне здесь?

Обновление: добавление деталей реализации AutoBahn (WebSocket client library for Android):

Клиент AutoBahn

 private void connect2() { mConnection = new WebSocketConnection(); final String wsuri = "ws://192.168.0.137:8888/"; String TAG = "ArticlesListActivity"; try { mConnection.connect(wsuri, new WebSocketHandler() { @Override public void onOpen() { Log.e(TAG, "Connected to: " + wsuri); } @Override public void onTextMessage(String payload) { Log.e(TAG, "Message recieved = " + payload); } @Override public void onClose(int code, String reason) { Log.e(TAG, "Connection Lost."); } }); } catch (WebSocketException e) { Log.d(TAG, e.toString()); } } 

С этой библиотекой – я могу подключиться к серверу, но мгновенно, соединение потеряно. (Обратитесь к «Журналу клиентов AutoBahn» ниже. Переключение обратно на weberknecht работает нормально. Я НЕ mConnection.disconnect() образом mConnection.disconnect() любом месте. Поэтому я не знаю, как соединение прекращается.

Журнал клиентов AutoBahn

 02-27 14:27:36.605: D/de.tavendo.autobahn.WebSocketConnection(27701): created 02-27 14:27:36.656: D/dalvikvm(27701): GC_FOR_ALLOC freed 164K, 4% free 9247K/9543K, paused 17ms 02-27 14:27:36.671: D/dalvikvm(27701): GC_FOR_ALLOC freed 7K, 4% free 9368K/9735K, paused 14ms 02-27 14:27:36.671: D/de.tavendo.autobahn.WebSocketReader(27701): created 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketConnection(27701): WS reader created and started 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketReader(27701): running 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketWriter(27701): created 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketConnection(27701): WS writer created and started 02-27 14:27:36.769: D/de.tavendo.autobahn.WebSocketReader(27701): run() : ConnectionLost 02-27 14:27:36.773: D/de.tavendo.autobahn.WebSocketReader(27701): ended 02-27 14:27:36.777: D/de.tavendo.autobahn.WebSocketConnection(27701): opening handshake received 02-27 14:27:36.777: E/ArticlesListActivity(27701): Connected to: ws://192.168.0.137:8888/ 02-27 14:27:36.781: D/de.tavendo.autobahn.WebSocketConnection(27701): fail connection [code = 3, reason = WebSockets connection lost 02-27 14:27:36.784: D/de.tavendo.autobahn.WebSocketReader(27701): quit 02-27 14:27:36.788: D/de.tavendo.autobahn.WebSocketWriter(27701): ended 02-27 14:27:36.792: E/ArticlesListActivity(27701): Connection Lost. 02-27 14:27:36.792: D/de.tavendo.autobahn.WebSocketConnection(27701): worker threads stopped 

Вот как я начинаю устранять эту проблему:

  1. Вы пытаетесь сделать это на своем телефоне (устройстве) или эмуляторе? Если вы пытаетесь сделать это на своем телефоне, и вы подключены через 3G, этого не произойдет. В этом случае вы пытаетесь подключиться к внутреннему IP-адресу из WAN, который не работает.

  2. Опять же, предполагая, что вы делаете это на устройстве, если вы подключены через Wi-Fi, это еще одна история. Убедитесь, что сервер доступен по адресу 192.168.207.84:8080 . Быстрый способ тестирования подключения (с вашего ПК):

     telnet 192.168.207.84 8080 

    Если он истечет, вы знаете, что ваш сервер не отвечает. Это, конечно, предполагает, что ваш компьютер находится в той же подсети, что и ваша сеть Wi-Fi.

  3. Если вы пытаетесь сделать это из своего эмулятора, выполните действия, описанные в [2], чтобы убедиться, что сервер достигнут, а также убедитесь, что ваш эмулятор находится в режиме моста (IP).

Подводя итог, основная причина, по которой обычно возникают таймауты, связана с отсутствием доступности сервера (т. Е. Отсутствием подключения). Вы не указали детали своей сети, поэтому я сделал несколько предположений здесь на основе IP-адреса, к которому вы пытались подключиться (192.168.207.84).

Насколько я понимаю, Weberknecht поддерживает Hybi-10, а не последнюю спецификацию RFC6455, и более проблематично, это сетевое взаимодействие в основном потоке (UI). Это, как правило, плохая идея, и не будет работать на Android> 2.

В Android-приложениях для Android есть Autobahn WebSockets для Android

https://github.com/oberstet/AutobahnAndroid

Он поддерживает окончательный RFC6455, хорошо интегрируется с пользовательскими интерфейсами и сервисными приложениями, обеспечивает RPC и PubSub поверх WebSockets и многое другое. Проверьте проект README на GitHub.

Отказ от ответственности: Я автор Autobahn.