tornado - WebSocketClientConnection - 如何捕获和处理连接失败?

时间:2015-01-21 18:36:57

标签: python websocket client tornado

我是龙卷风,也是Websocket的新手。如何使用Tornado实现websocket服务器应用程序有很多资源。但是,我还没有找到一个完整的示例,其中包含构建在Tornado之上的websocket客户端应用程序。


服务器应用程序(server.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import tornado.web
import tornado.websocket
import tornado.ioloop
import tornado.options

from tornado.options import define, options

define("port", default=3000, help="run on the given port", type=int)


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [(r"/", MainHandler)]
        settings = dict(debug=True)
        tornado.web.Application.__init__(self, handlers, **settings)


class MainHandler(tornado.websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True

    def open(self):
        logging.info("A client connected.")

    def on_close(self):
        logging.info("A device disconnected")


def main():
    tornado.options.parse_command_line()
    app = Application()
    app.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()

客户端应用程序(client.py):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tornado.ioloop import IOLoop
from tornado.websocket import websocket_connect


if __name__ == "__main__":
    ws = websocket_connect("ws://localhost:3000")
    IOLoop.instance().start()

问题&问题

我对服务器应用程序没有任何问题。但是,对于客户端应用程序,我不能说同样的事情。为什么呢?

  1. 如果服务器出现故障,客户端应用程序不会做出反应。它没有说“嘿,服务器已经失败了。”。我编写自己的WebSocketClientConnection类(由原始继承)和websocket_connect函数(相同的函数,但这个使用我的WebSocketClientConnection类)。我在我的WebSocketClientConnection类中重写了on_connection_close方法,因此我可以捕获“服务器关闭中间连接”失败。但是,我不能让它重新连接。如何重新连接服务器?
  2. 如果服务器在连接之前已经关闭,则客户端应用程序不会引发任何事情并且看起来很完美。我不知道如何抓住这个失败。如何捕获此连接失败?
  3. 我的WebSocketClientConnection类:

    class MyWebSocketClientConnection(tornado.websocket.WebSocketClientConnection):
        def on_connection_close(self):
            super(MyWebSocketClientConnection, self).on_connection_close()
            print "connection closed"
    

    感谢。

2 个答案:

答案 0 :(得分:1)

websocket_connect返回Future;要查看它是成功还是失败,你必须检查Future(可能通过在协程中产生它)。此外,在建立连接后,您应该进入read_message循环。即使您不希望客户端发送任何消息,您仍然应该调用read_message:这就是建立后关闭的连接(read_message将返回None)。

@gen.coroutine
def my_websocket_client(url):
    ws = yield websocket_connect(url)
    while True:
        msg = yield ws.read_message()
        if msg is None: break
        # do stuff with msg

答案 1 :(得分:0)

顺便说一句,在我弄清楚之后,我确实写了一个示例Tornado WebSocket客户端/服务器对来演示如何做到这一点。

https://github.com/ilkerkesen/tornado-websocket-client-example

我希望它有所帮助。