(1)websocket 协议 与 http协议
websocket 协议,双工通道 socket连接不断开
http 协议 ,只能请求响应 (用户主动获取) socket连接断开
都是基于socket
---- 客户端都是浏览器
(2)轮询
一般用户量少的 都是用 websocket来做即时通讯
轮询 --- 一直发请求,定死的,2秒钟取一次
长轮询 --- 请求之后,没有新消息,夯住,30秒之内没有新消息,断开
重新请求,如果有新消息,立刻返回消息
(3) ws 协议小例
创建 socket 服务端
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind(('127.0.0.1',8002))
sock.listen(5)
conn,addr = sock.accept()
data = conn.recv(1024)
print(data)
创建 scoket 客户端
<script type="text/javascript">
var socket = new WebSocket("ws://127.0.0.1:8002")
// 浏览器 会立即创建一个 socket对象 ,连接
</script>
</body>
但是服务端 必须返回固定格式的内容给浏览器 ,才能保证 正常的连接
【握手信息】魔法字符串
(5) WebSocket协议是基于TCP的一种新的协议。
WebSocket最初在html5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符。
它实现了浏览器与服务器全双工(full-duplex)通信。
其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信。
请求和响应的【握手】信息需要遵循规则:
从请求【握手】信息中提取 Sec-WebSocket-Key
利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密,再进行base64加密
将加密结果响应给客户端
注:magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11
(6) tornado 实现 websocket
Tornado是一个支持WebSocket的优秀框架,当然Tornado内部封装功能更加完整。
(7)客户端和服务端传输数据时,需要对数据进行【封包】和【解包】
客户端的JavaScript类库已经封装【封包】和【解包】过程,但Socket服务端需要手动实现。
第一步:获取客户端发送的数据【解包】 Payload
第二步:向客户端发送数据【封包】