我正在使用龙卷风进行实时应用。我正在使用redis。
当我访问其中2为我的用户ID的网址127.0.0.1:8888/2/
时,我收到错误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()函数中打印的内容
需要建议
答案 0 :(得分:2)
这是Tornado处理WebSockets的GET方法的开始:
@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
答案 1 :(得分:1)
我在 Tornado 中尝试创建 WebSocket 时遇到了同样的错误消息。我在网上找到的所有答案(包括此处)都是准确的,但并没有解决我遇到的问题。
我终于意识到,由于我在 nginx 后面运行我的 Tornado 服务器,这与我的 Python 或 JavaScript 程序无关。相反,这是服务器配置问题。
我通过正确配置我的 nginx 服务器 using information from their site 找到了我的解决方案。
如果有人遇到同样的问题,我想建议还检查是否存在任何适用的错误配置的服务器或负载平衡器设置。