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协议支持客户端发起和服务器发起的ping和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): | 
仅仅这些不够 我们下面我们看下如何支持多服务端的情况
