Python Web学习笔记之WebSocket 通信过程与实现
长轮询的方式:
使用Websocket方式:
Websocket方式同样支持客户端主动发送数据
连接可能因为许多你无法控制的原因而意外关闭。任何Web应用程序都应该能够很好地处理间歇连接性并正确地恢复。然而,有些连接关闭的原因是可以且应当避免的。可以避免的常见连接丢失原因是TCP级别的空闲,这会影响WebSocket连接。
说明 : 因为WebSocket连接处于TCP连接的上层,发生在TCP级别的连接问题会影响WebSocket连接。
在客户端和WebSocket服务器之间的全双工连接中,有时候连接上可能没有数据流。在这个时候,网络中介可能中止连接。具体地说,不知道“始终打开”连接的网络组件有时候会关闭不活跃的TCP连接,从而关闭WebSocket连接。例如,代理服务器和家庭路由器有时候会关闭它们认为是空闲的连接。WebSocket协议支持用于连接健康检查和保持连接打开状态的ping
和pong
。
使用WebSocket ping
和pong
能够保持连接打开,为数据流动做好准备。ping
和pong
可以从打开的WebSocket连接的任一端发起。WebSocket协议支持客户端发起和服务器发起的pin
g和pong
。浏览器或服务器(也可以是两者)都可以在合适的时间间隔内发起ping
和pong
,保持连接活跃。注意,我们说的是浏览器而不是WebSocket客户端,WebSocket API目前不支持客户端发起的ping
和pong
。虽然浏览器可能根据自己的持续性和健康检查策略发起ping
和pong
,但大部分ping
和pong
是服务器发起的;WebSocket客户端可以用pong
响应ping
。浏览器和服务器也可以在没有接收ping
的情况下发出pong
,这为你提供了保持连接活跃时的灵活性。你所使用的时间间隔根据应用程序的受众和通过WebSocket连接的数据流速而定。保守地说,每30秒发送一个pong
应该能够保持大部分连接的活跃性,但是更低的频率能够节约带宽和服务器资源。
看下源码:
1 | class EchoWebSocket(tornado.websocket.WebSocketHandler): |
对应的js源码:
1 | var ws = new WebSocket("ws://localhost:8888/websocket"); |
我们看下源码中值得注意的
1 | def open(self, *args: str, **kwargs: str) -> Optional[Awaitable[None]]: |
因此我们可以将open
和on_message
写成协程的方式
1 | async def open(self): |
仅仅这些不够 我们下面我们看下如何支持多服务端的情况