我是龙卷风,也是Websocket的新手。如何使用Tornado实现websocket服务器应用程序有很多资源。但是,我还没有找到一个完整的示例,其中包含构建在Tornado之上的websocket客户端应用程序。
#!/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()
#!/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()
我对服务器应用程序没有任何问题。但是,对于客户端应用程序,我不能说同样的事情。为什么呢?
我的WebSocketClientConnection类:
class MyWebSocketClientConnection(tornado.websocket.WebSocketClientConnection):
def on_connection_close(self):
super(MyWebSocketClientConnection, self).on_connection_close()
print "connection closed"
感谢。
答案 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
我希望它有所帮助。