Python websockets,websocket python3实现

  Python websockets,websocket python3实现

  1.什么是WebSocket?

  WebSocket是一个标准协议,用于客户端和服务器之间的双向数据传输。但它与HTTP无关,它是基于TCP的独立实现。

  以前客户端想知道服务器的处理进度,就要用Ajax不断地进行轮询,让浏览器每隔几秒就向服务器发送一次请求,给服务器造成了很大的压力。另一种轮询方式是使用长轮询,类似于打电话。在收到信息之前,你不会挂断电话。也就是说,客户端发起连接后,如果没有消息,就不会向客户端返回响应,连接阶段一直被阻塞。

  WebSocket解决了HTTP的这些问题。当服务器完成协议升级(HTTP-WebSocket)时,服务器可以主动向客户端推送信息,从而解决了轮询带来的同步延迟。由于WebSocket只需要一次HTTP握手,服务器就可以保持与客户端的通信,直到连接关闭,从而解决了服务器需要反复解析HTTP协议的问题,减少了资源开销。

  随着新标准的推进,WebSocket已经越来越成熟,主流浏览器对WebSocket的支持都很好(不兼容IE的较低版本,IE 10以下)。有时间可以看看。

  在使用WebSocket时,前端的使用是比较标准的。js支持ws协议,这种协议感觉上类似于一种轻量级封装的套接字协议,只是它以前需要自己维护套接字连接。现在可以用一个比较标准的方法来做。

  下面结合上图说一下WebSocket的通信过程。

  第二,建立联系。

  1.客户端请求消息标题客户端请求消息

  不同于传统的HTTP消息:

  这两行表示启动了WebSocket协议。

  Sec-WebSocket-Key由浏览器随机生成,它提供了针对恶意或无意连接的基本保护。

  Sec-WebSocket-Version表示WebSocket的版本。一开始WebSocket协议太多,不同厂商都有自己的协议版本,但现在已经决定了。如果服务器不支持该版本,则需要返回一个Sec-WebSocket-Versionheader,其中包含服务器支持的版本号。

  创建WebSocket对象:

  Ws的意思是使用WebSocket协议,后面是地址和端口。

  完整的客户端代码:

  2.服务器响应消息头首先,我们来看看服务器响应消息:

  让我们一行一行地解释一下:

  第一,101状态码表示服务器已经理解了客户端的请求,会通过升级头通知客户端采用不同的协议来完成请求;那么,Sec-WebSocket-Accept就是已经被服务器确认并加密的Sec-web socket-key;最后,Sec-WebSocket-Protocol是最终要使用的协议。sec-web socket-接受计算方法:

  Sec-WebSocket-Key拼接258 eafa 5-e914-47da-95ca-C5 ab 0 DC 85 b 11;通过SHA1计算摘要,并将其转换为base64字符串。注意:SEC-web socket-Key/SEC-web socket-Accept的转换只能带来基本的保障,但是连接是否安全,数据是否安全,客户端/服务器对于ws客户端和ws服务器是否合法,实际上是没有实际保障的。

  创建一个主线程,用于接受WebSocket建立请求:

  3.通信a .服务器解析WebSocket消息

  服务器接收客户端发送的消息,需要对其进行分析。

  客户端包格式

  1.鳍:1位

  0:不是消息1的最后片段:它是消息2的最后片段。RSV1、RSV2、RSV3:每个1位。

  一般来说,都是0。当客户端和服务器协商采用WebSocket扩展时,这三个标志位可以是非0,值的含义由扩展定义。如果出现非零值并且未使用WebSocket扩展,则会发生连接错误。

  3.操作码:4位

  %x0:表示连续帧。当Opcode为0时,表示本次数据传输采用了数据分片,当前接收的数据帧是数据分片之一;%x1:表示这是一个文本框;%x2:表示这是一个二进制帧;%x3-7:保留的操作码用于非控制帧的后续定义;%x8:表示连接已断开;%x9:表示这是一个心跳请求(ping);%xA:表示这是心跳响应(pong);%xB-F:保留的操作码用于以后定义的控制帧。4.掩码:1位

  指示是否屏蔽数据负载。

  0:否1:是5。有效载荷长度:7位或(7 ^ 16)位或(7 ^ 64)位

  指示数据有效负载的长度。

  0~126:数据长度等于该值;26:接下来的2个字节代表一个16位无符号整数,其值是数据的长度;27:接下来的8个字节代表一个64位无符号整数(最高位为0),这个无符号整数的值就是数据的长度。6.屏蔽键:0或4字节

  当Mask为1时,它携带4个字节的屏蔽密钥;当Mask为0时,没有屏蔽键。屏蔽算法:按位做循环异或运算,先对该位的索引取模,得到Masking-key中对应的值X,然后将该位与X进行异或运算,得到真正的字节数据。注意:mask的作用不是为了防止数据泄露,而是为了防止代理缓存中毒攻击以及协议早期版本中存在的其他问题。

  有效载荷数据:有效载荷数据

  解析WebSocket消息的代码如下:

  B.服务器发送WebSocket消息

  返回时不携带掩码,所以掩码位为0,然后根据净荷数据的大小写长度,最后写净荷数据。

  结构模块分析

  根据给定的格式fmt,数据被封装成一个字符串(实际上是一个类似于C结构的字节流)

  struct中支持的格式如下:

  为了用C语言中的结构交换数据,要考虑到有些C或C编译器使用字节对齐,通常是以4个字节为单位的32位系统,所以struct是按照本地机器的字节顺序进行转换的。您可以更改格式中第一个字符的对齐方式,其定义如下:

  发送WebSocket消息的代码如下

  三。总结目前还没有其他技术能像WebSocket一样实现全双工传输。到目前为止,大多数开发人员仍然使用Ajax轮询来实现它,但这是一个不太优雅的解决方案。虽然WebSocket用的人不多,但可能是因为协议刚出来时的安全问题,以及兼容的浏览器不多,现在已经解决了。如果您有这些需求,请考虑使用WebSocket:

  多个用户之间的交互;需要经常向服务器请求更新数据。如弹幕、消息订阅、多人游戏、协同编辑、股票基金实时报价、视频会议、在线教育等对实时性要求较高的场景。

  见第https://条www.zhihu.com/question/20215561/answer/40316953http://fullstackpython.atjiang.com/websockets.html3358 www.52im.net/thread-1341-1-1.html.

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: