python之websocket

一、websocket

   WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信。其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信。

 本文将使用Python编写Socket服务端,一步一步分析请求过程!!!

1. 启动服务端


python之websocket_第1张图片

启动Socket服务器后,等待用户【连接】,然后进行收发数据。

2. 客户端连接


python之websocket_第2张图片

当客户端向服务端发送连接请求时,不仅连接还会发送【握手】信息,并等待服务端响应,至此连接才创建成功!

3. 建立连接【握手】


python之websocket_第3张图片

请求和响应的【握手】信息需要遵循规则:

从请求【握手】信息中提取 Sec-WebSocket-Key

利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密,再进行base64加密

将加密结果响应给客户端

注:magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11

请求【握手】信息为:


python之websocket_第4张图片

提取Sec-WebSocket-Key值并加密:


python之websocket_第5张图片

4.客户端和服务端收发数据

客户端和服务端传输数据时,需要对数据进行【封包】和【解包】。客户端的JavaScript类库已经封装【封包】和【解包】过程,但Socket服务端需要手动实现。

第一步:获取客户端发送的数据【解包】


python之websocket_第6张图片

解包详细过程:


python之websocket_第7张图片

第二步:向客户端发送数据【封包】


python之websocket_第8张图片

5. 基于Python实现简单示例

a. 基于Python socket实现的WebSocket服务端:


python之websocket_第9张图片

b. 利用JavaScript类库实现客户端


python之websocket_第10张图片

6. 基于Tornado框架实现Web聊天室

Tornado是一个支持WebSocket的优秀框架,其内部原理正如1~5步骤描述,当然Tornado内部封装功能更加完整。

以下是基于Tornado实现的聊天室示例:


python之websocket_第11张图片


python之websocket_第12张图片

你可能感兴趣的:(python之websocket)