javascript - 使用 Tornado 和 Javascript 客户端的 Hello world

标签 javascript tornado

我想在 Tornado 服务器和 Javascript 客户端之间建立简单的双向通信。

当我运行服务器,然后打开页面时,服务器按预期打印出“get”。但是,当服务器发回某些内容时,onmessage 事件似乎从未在客户端中触发。此外,Javascript 控制台会产生以下错误:

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

我不知道我在这里做错了什么。

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 客户端 (tornado.html):

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

最佳答案

您需要一个单独的 WebSocketHandler实例映射到应用程序中的单独 URL。所以你的“tornado.html”应该映射到 URL“/”,你的 Javascript 应该连接到一个 WebSocketHandler 监听像“/websocket”这样的 URL。试试这个:

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

关于javascript - 使用 Tornado 和 Javascript 客户端的 Hello world,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186501/

相关文章:

python - 在 Tornado 中删除安全 Cookie

javascript - 在不使用 Jquery 的情况下,在 MVC View 中的页面中按 Enter 时按钮触发

javascript - 仅当事件位于具有特定类的 dom 元素之外时才触发事件

javascript - Socket.io 设置导致数百个传输轮询 GET 请求

javascript - 在另一个 CSSTransition 中嵌套 CSSTransitions?

python - 如何自定义 Tornado 的访问日志

python - Tornado IOError "Stream is closed"请求完成()

javascript - ExtJS 6.0.1 禁用单元格选择

python - 运行多个 Tornado 进程

node.js - 关于非阻塞且快速的服务器、框架、语言的建议?