Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android websocket客户端超时_Android_Client Server_Websocket_Tornado - Fatal编程技术网

android websocket客户端超时

android websocket客户端超时,android,client-server,websocket,tornado,Android,Client Server,Websocket,Tornado,谢谢你的阅读 背景: 我正在为服务器开发一个Android客户端,其中的需求是应用程序,它需要与基于WebSockets的服务器不断地来回交换消息 实现:对于客户端,我使用Android的WebSocket客户端库,而服务器基于Tornado 问题: 目前,我通过生成一个AsyncTask来调用onCreate中的initWebSocketClient。但是,我一直收到客户端超时异常 Android客户端: private void initWebSocketClient() {

谢谢你的阅读

背景: 我正在为服务器开发一个Android客户端,其中的需求是应用程序,它需要与基于
WebSockets
的服务器不断地来回交换消息

实现:对于客户端,我使用Android的
WebSocket
客户端库,而服务器基于
Tornado

问题: 目前,我通过生成一个
AsyncTask
来调用
onCreate
中的
initWebSocketClient
。但是,我一直收到客户端超时异常

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();
        }
    }

#!/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
龙卷风服务器:


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();
        }
    }

#!/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
客户端超时异常:


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();
        }
    }

#!/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(适用于Android的WebSocket客户端库)实施详细信息:

高速公路客户机


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()
。因此我不知道连接是如何终止的

高速公路客户端日志


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

以下是我将如何开始对此进行故障排除:

  • 您正在尝试在手机(设备)或模拟器上执行此操作吗?如果您正在尝试在手机上执行此操作,并且您通过3G连接,则不会发生这种情况。在这种情况下,您正在尝试从WAN连接到无法工作的内部IP地址

  • 再次假设您在设备上执行此操作,如果您通过Wifi连接,则这是另一回事。请确保可以通过
    192.168.207.84:8080
    访问服务器。这是一种快速测试连接(从PC)的方法:

    如果超时,您知道您的服务器没有响应。当然,这是假设您的PC与Wifi网络位于同一子网中

  • 如果您试图从仿真器执行此操作,请按照[2]中的步骤确保服务器可访问,并确保仿真器处于(IP)桥接模式


  • 总而言之,通常发生超时的主要原因是服务器可用性不足(即缺乏连接)。您没有提到网络的详细信息,因此我根据您尝试连接的IP(192.168.207.84)在这里做了一些假设.

    据我所知,Weberknecht只支持Hybi-10,而不是最终的RFC6455规范,更麻烦的是,它在主(UI)线程上联网。这通常是个坏主意,在Android>2上会失败

    对于Android原生应用程序,有适用于Android的Autobahn WebSockets

    它支持最终的RFC6455,与UI和服务应用程序集成良好,通过WebSockets提供RPC和PubSub等


    免责声明:我是Autobahn的作者。

    太棒了!感谢@Marvin的详细解释,这完全帮助我解决了问题。我使用的是一台设备,但我的服务器是内部IP。因此,现在我将服务器和设备都登录到同一个wifi上,并能够让它连接到服务器!感谢您提供的信息!您的解决方案sounds功能齐全,我在研究的时候回头看了看,但我在这里没有看到适用于Android的WebSockets:顺便说一句,我只是想知道它是否可以免费用于商业用途?顺便说一句,我为WebSockets网络活动生成了一个AsyncTask,所以它目前运行良好。代码在Apache 2.0许可证下..开源.Rgd.AsyncTask..使用您不需要的最新代码不需要这样做,因为不仅套接字读/写是在后台线程上完成的,而且初始套接字连接也是如此。后一点直到最近才有所不同。.在后台线程上读/写,但不是初始套接字连接。.这会导致“UI上的网络”最近Android上的线程问题。Autobahn for Android支持WebSockets协议草案版本Hybi-10直到最终RFC6455。我不知道Tornado WS 2.2实现了什么..对我有用:Tornado 2.2+上面的代码+Autobahn Android的Echo客户端演示。可能Tornado 2.1 WS impl.可能太旧了..试试2.2。。