тайм-аут клиента Android - PullRequest
       26

тайм-аут клиента Android

6 голосов
/ 01 февраля 2012

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

Справочная информация: Я разрабатываю клиент 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 Server:


#!/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 для 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(). Поэтому я не знаю, как прерывается соединение.

Журнал клиента 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

Ответы [ 2 ]

5 голосов
/ 14 февраля 2012

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

Для собственных приложений Android есть Autobahn WebSockets для Android

https://github.com/oberstet/AutobahnAndroid

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

Отказ от ответственности: я являюсь автором автобана.

5 голосов
/ 02 февраля 2012

Вот как я бы начал устранять неисправности:

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

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

    telnet 192.168.207.84 8080
    

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

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

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

...