tornado - WebSocketClientConnection - 如何捕获和处理连接失败?
tornado - WebSocketClientConnection - How to catch and handle connection failures?
我是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()
问题与疑问
我对服务器应用程序没有任何问题。但是,我不能对客户端应用程序说同样的话。为什么?
- 如果服务器出现故障,客户端应用程序不会做出反应。它没有说 "Hey, server is down buddy."。我写了我自己的 WebSocketClientConnection class(由原来的继承)和 websocket_connect 函数(相同的函数,但是这个使用我的 WebSocketClientConnection class)。我重写了我的 WebSocketClientConnection class 中的 on_connection_close 方法,因此我可以捕获 "server down on middle of the connection" 失败。但是,我无法让它重新连接。如何让它重新连接到服务器?
- 如果服务器在连接之前已经关闭,客户端应用程序不会引发任何问题并且看起来很完美。我不知道如何抓住那个失败。我如何捕获此连接失败?
我的 WebSocketClientConnection class:
class MyWebSocketClientConnection(tornado.websocket.WebSocketClientConnection):
def on_connection_close(self):
super(MyWebSocketClientConnection, self).on_connection_close()
print "connection closed"
谢谢。
websocket_connect
return一个Future
;要查看它是成功还是失败,您必须检查 Future
(可能通过在协程中产生它)。此外,建立连接后,您应该进入 read_message
循环。即使您不希望客户端发送任何消息,您仍然应该调用 read_message
:这就是连接建立后关闭的方式(read_message
将 return 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
顺便说一句,在我想通之后,我确实写了一个示例 Tornado WebSocket client/server 对来演示如何做。
https://github.com/ilkerkesen/tornado-websocket-client-example
希望对大家有所帮助。
我是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()
问题与疑问
我对服务器应用程序没有任何问题。但是,我不能对客户端应用程序说同样的话。为什么?
- 如果服务器出现故障,客户端应用程序不会做出反应。它没有说 "Hey, server is down buddy."。我写了我自己的 WebSocketClientConnection class(由原来的继承)和 websocket_connect 函数(相同的函数,但是这个使用我的 WebSocketClientConnection class)。我重写了我的 WebSocketClientConnection class 中的 on_connection_close 方法,因此我可以捕获 "server down on middle of the connection" 失败。但是,我无法让它重新连接。如何让它重新连接到服务器?
- 如果服务器在连接之前已经关闭,客户端应用程序不会引发任何问题并且看起来很完美。我不知道如何抓住那个失败。我如何捕获此连接失败?
我的 WebSocketClientConnection class:
class MyWebSocketClientConnection(tornado.websocket.WebSocketClientConnection):
def on_connection_close(self):
super(MyWebSocketClientConnection, self).on_connection_close()
print "connection closed"
谢谢。
websocket_connect
return一个Future
;要查看它是成功还是失败,您必须检查 Future
(可能通过在协程中产生它)。此外,建立连接后,您应该进入 read_message
循环。即使您不希望客户端发送任何消息,您仍然应该调用 read_message
:这就是连接建立后关闭的方式(read_message
将 return 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
顺便说一句,在我想通之后,我确实写了一个示例 Tornado WebSocket client/server 对来演示如何做。
https://github.com/ilkerkesen/tornado-websocket-client-example
希望对大家有所帮助。