WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
Sanic支持websocket版本7和8。
服务端:
from sanic import Sanic
from sanic.websocket import WebSocketProtocol
app = Sanic(__name__)
@app.websocket('/ws')
async def feed(request, ws):
while True:
receive_data = await ws.recv()
print('服务端接收客户端: ' + receive_data)
send_data = 'hello!'
print('服务端发给客户端: ' + send_data)
await ws.send(send_data)
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000, protocol=WebSocketProtocol)
客户端:
import asyncio
import websockets
async def hello():
uri = "ws://127.0.0.1:8000/ws"
async with websockets.connect(uri) as websocket:
# 发送给服务端的信息
message = input('input: ')
print(f"发送给服务端的信息:{message}")
await websocket.send(message)
# 接收服务端的信息
bytes_data = await websocket.recv()
# bytes 转 string
str_data = str(bytes_data)
print("接收来自服务端的信息:{}".format(str_data))
if __name__ == '__main__':
r = hello()
asyncio.run(r)
启动ws服务端
图片
启动ws客户端,发送和接收效果:
图片
ws服务端,接收和发送效果:
图片