简体   繁体   English

带有 Tornado 和 Javascript 客户端的 Hello World

[英]Hello world with Tornado and Javascript client

I would like to establish a simple two-way communication between a Tornado server and a Javascript client.我想在 Tornado 服务器和 Javascript 客户端之间建立一个简单的双向通信。

When I run the server, followed by opening the page, the server prints out "get" as expected.当我运行服务器,然后打开页面时,服务器按预期打印出“get”。 However, while the server sends something back, the onmessage event never seems to be triggered in the client.但是,当服务器发回一些东西时,onmessage 事件似乎永远不会在客户端中触发。 Moreover, the Javascript console produces the following error:此外,Javascript 控制台会产生以下错误:

WebSocket connection to 'ws://localhost:8888/' failed: Error during WebSocket handshake: Unexpected response code: 200

I have no clue what I am doing wrong here.我不知道我在这里做错了什么。

Python server (tornadoserver.py): Python 服务器(tornadoserver.py):

import tornado.ioloop
import tornado.web

class Hello(tornado.web.RequestHandler):
    def get(self):
        print("get")
        self.write("Hello, world")
        self.flush()


application = tornado.web.Application([
    (r"/", Hello),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Javascript client (tornado.html): Javascript 客户端(tornado.html):

<script>
ws = new WebSocket("ws://localhost:8888/");
ws.onmessage = function(e) {
    alert('message received: ' + e.data);
};
</script>

You need a separate WebSocketHandler instance mapped to a separate URL in your application.您需要一个单独的WebSocketHandler实例映射到应用程序中的单独 URL。 So your "tornado.html" should be mapped to the URL "/", and your Javascript should connect to a WebSocketHandler listening on a URL like "/websocket".因此,您的“tornado.html”应该映射到 URL“/”,并且您的 Javascript 应该连接到监听诸如“/websocket”之类的 URL 的 WebSocketHandler。 Try this:尝试这个:

import tornado.ioloop
import tornado.web
import tornado.websocket


class Hello(tornado.websocket.WebSocketHandler):
    def open(self):
        self.write_message("Hello, world")

    def on_message(self, message):
        pass

    def on_close(self):
        pass


class Main(tornado.web.RequestHandler):
    def get(self):
        # This could be a template, too.
        self.write('''
<script>
ws = new WebSocket("ws://localhost:8888/websocket");
ws.onmessage = function(e) {
    alert('message received: ' + e.data);
};
</script>''')


application = tornado.web.Application([
    (r"/", Main),
    (r"/websocket", Hello),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM