WebSocket 协议
WebSocket:在 2008 年诞生,2011 年成为国际标准。它允许服务器主动向客户端推送信息,客户端也可以主动向服务器发送信息,实现了真正的双向平等对话。它是一种在单个 TCP 连接上进行全双工通讯的协议,能够更高效地进行实时通信。
传统的轮询:浏览器需要不断地向服务器发出 HTTP 请求,浪费带宽和服务器资源。
WebSocket 的优点:
- 建立在 TCP 协议之上,服务器端实现相对容易。
- 与 HTTP 协议兼容性好,默认端口也是 80 和 443,握手阶段采用 HTTP 协议。
- 数据格式轻量,通信高效。
- 支持文本和二进制数据传输。
- 无同源限制,客户端可以与任意服务器通信。
- 协议标识符是 ws(不加密)和 wss(加密)
WS 和 WSS
- WS(WebSocket):是一种在单个 TCP 连接上进行全双工通讯的协议。它允许服务器和客户端之间进行实时双向通信。
- WSS:是加密的 WebSocket 协议,相当于 WebSocket 加上 SSL/TLS 加密层。
WS + SSL/TLS = WSS。
python sample
- 生成无密码保护的自签名证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
common name 也就是你的domain的name, 正式的项目中需要使用第三方认证机构提供的证书
- server端代码
import asyncio
import ssl
import websockets
async def echo(websocket, path):
async for message in websocket:
await websocket.send(message)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(certfile="cert.pem", keyfile="key.pem")
start_server = websockets.serve(echo, "localhost", 8765, ssl=ssl_context)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
- client 端代码, python 端
import asyncio
import ssl
import websockets
async def hello():
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.load_verify_locations("cert.pem")
uri = "wss://localhost:8765"
async with websockets.connect(uri, ssl=ssl_context) as websocket:
await websocket.send("Hello, world!")
greeting = await websocket.recv()
print(f"< {greeting}")
asyncio.get_event_loop().run_until_complete(hello())
其他
正式的wss 需要使用第三方进行认证,如let’s encrypt 等服务, 而不是自己生成的证书。