tornado 只能升级到 websocket 错误

Posted

技术标签:

【中文标题】tornado 只能升级到 websocket 错误【英文标题】:tornado can upgrade only to websocket error 【发布时间】:2015-10-05 08:39:09 【问题描述】:

我正在使用龙卷风进行实时应用。我为此使用redis。 当我访问 url 127.0.0.1:8888/2/ 其中 2 是我的用户 ID 时,我收到错误消息 can "Upgrade" only to websocket

我不知道为什么会收到此错误。出现此错误是因为我的代码或 websocket 的一些问题?

在我的 javascript 上,我正在做 ws = new WebSocket("ws://127.0.0.1:8888/" + user_id + "/");

当我执行127.0.0.1:8888 时,它会打印我在 RequestHandler 的 get() 函数中打印的内容

需要建议

【问题讨论】:

您的处理程序类是否扩展了tornado.websocket.WebSocketHandler 类? 是的,它确实扩展了.. 您在描述中的路线是否有斜杠/?对我来说,看起来路线不匹配。您也可以在问题中发布您的 Python 代码。 您使用的是哪个浏览器?你能在get()prepare()中打印self.request.headers.get("Upgrade")的值吗? 【参考方案1】:

这是 Tornado 的 GET 方法处理 WebSockets 的开始:

@tornado.web.asynchronous
def get(self, *args, **kwargs):
    self.open_args = args 
    self.open_kwargs = kwargs

    # Upgrade header should be present and should be equal to WebSocket
    if self.request.headers.get("Upgrade", "").lower() != 'websocket':
        self.set_status(400)
        self.finish("Can \"Upgrade\" only to \"WebSocket\".")                                                                                                                                                                                                              
        return

因此,您收到的错误消息是由于您的请求中缺少“升级”标头造成的,当您在浏览器中简单地获取 URL 时看到此消息时,这并不是错误。但是,如果您使用您提供的 JS 代码然后运行 ​​ws.send("message"),您应该能够在 Tornado WebSocketHandler 中捕获并处理此消息:

def on_message(self, message):
    print(message)  # print the message to a standard output
    self.write_message(message)  # throw it back to client

【讨论】:

如何更改/点击/修改/重载这个@tornado.web.asynchronous 函数?【参考方案2】:

我在 Tornado 中尝试创建 WebSocket 时遇到了同样的错误消息。我在网上找到的所有答案(包括这里)都是准确的,但并没有解决我遇到的问题。

我终于意识到,由于我在 nginx 后面运行我的 Tornado 服务器,这与我的 Python 或 JavaScript 程序无关。相反,这是一个服务器配置问题。

我通过正确配置我的 nginx 服务器 using information from their site 找到了我的解决方案。

如果有人遇到同样的问题,我想建议您同时检查任何适用的错误配置服务器或负载平衡器设置。

【讨论】:

以上是关于tornado 只能升级到 websocket 错误的主要内容,如果未能解决你的问题,请参考以下文章

tornado+websocket+mongodb实现在线视屏文字聊天

如何在 Tornado 中创建多个 websocket 聊天?

同时使用 Python Tornado 后端、WebSocket 监听器和 MQTT 客户端

Python Tornado Websocket 处理程序在接收数据时阻塞

使用 tornado websockets 传递消息

如何在实时服务器而不是本地主机上使用 Tornado 实现 WebSocket