websocket基本概念

(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
第二步:向客户端发送数据【封包】
原文地址:https://www.cnblogs.com/big-handsome-guy/p/8661159.html