Javascript 如何在刷新客户端网页时重新连接到Web套接字

Javascript 如何在刷新客户端网页时重新连接到Web套接字,javascript,python,websocket,socket.io,tornado,Javascript,Python,Websocket,Socket.io,Tornado,当我刷新客户端网页时,我停止从tornado套接字服务器接收数据。如何重新连接到流 我曾尝试将连接对象附加到列表中,然后在连接关闭时从列表中删除连接,但结果表明,当您刷新页面时,连接从未关闭,根据服务器,它保持活动状态,但它也不再在客户端接收数据:( 这是我的龙卷风服务器 #python 3 从tornado导入web、httpserver、ioloop、websocket、选项 从时间导入时间,睡眠 类ChannelHandler(websocket.WebSocketHandler): “”

当我刷新客户端网页时,我停止从tornado套接字服务器接收数据。如何重新连接到流

我曾尝试将连接对象附加到列表中,然后在连接关闭时从列表中删除连接,但结果表明,当您刷新页面时,连接从未关闭,根据服务器,它保持活动状态,但它也不再在客户端接收数据:(

这是我的龙卷风服务器

#python 3
从tornado导入web、httpserver、ioloop、websocket、选项
从时间导入时间,睡眠
类ChannelHandler(websocket.WebSocketHandler):
“”“处理websocket通道的处理程序”“”
连接=列表()
@类方法
def URL(cls):
return[(r'/websocket',cls,{}]
def初始化(自):
self.channel=None
def打开(自):
#当客户端打开websocket时
#将新连接添加到连接
self.connections.append(self)
def on_消息(自我,消息):
#在通道上接收到消息
#继续向所有连接的客户端发送时间信息
尽管如此:
[client.write_消息({'time()':str(time())})用于self.connections中的客户端]
睡眠(1)
打印('仍在发送')
def on_关闭(自身):
#频道关闭了
#如果活动连接关闭,则从活动连接中删除客户端
self.connections.remove(self)
打印('闭合连接?')
def检查_原点(自身、原点):
#如果需要,覆盖原点检查
返回真值
def main():
#创建tornado应用程序并提供URL路由
app=web.Application(ChannelHandler.url())
#安装HTTP服务器
http_server=httpserver.httpserver(应用程序)
http_server.listen(8000,“localhost”)
#启动IO/事件循环
ioloop.ioloop.instance().start()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
套接字客户端是


var ws=newwebsocket(“ws://localhost:8000/WebSocket”);
ws.onopen=函数(){
发送(“你好,世界”);
};
ws.onmessage=函数(evt){
控制台日志(evt.data);
};

那么,当我刷新cleint网页时,我怎么能一直从套接字服务器接收数据呢?

循环阻塞了整个服务器。你在循环中添加了一个
sleep(1)
调用来暂停循环一秒钟,但是
时间。sleep
是一个阻塞函数,因此也没有任何帮助

你需要使用一个异步的方法来代替时间睡眠
-Tornado's
gen.sleep

您还需要将
on_message
函数转换为协同程序

例如:

from tornado import gen


async def on_message(...):
    ...
    while True:
        ...
        await gen.sleep(1)
        ...

作为附加提示,请使用
set()
而不是
list()
来存储连接,以免意外添加重复的连接

在这种情况下,您还需要稍微修改代码。
set
没有
append
方法,而是有
add
方法

connections = set()
...
self.connections.add(self) # to add connection
...
self.connections.remove(self) # to remove connetion

你有一个无限的
while
循环在\u message上的
中。由于Tornado使用一个线程,你基本上完全阻塞了整个服务器。什么也不会发生。永远不要运行无限的
while
循环。也不要在\u message
处理程序上的
中运行定期任务。你需要一个后台异步作业。@freakish如果循环中的代码使用
yield
await
语法,从而使循环暂停,IOLoop可以运行其他任务,则Inifinite
while
循环不是问题。但是,在这种情况下,如果没有
yield
/
await
就有问题了。谢谢@xyres。解决了我的难题。