WebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术,是HTML5的技术之一,放到现在也并不是一个多新鲜的东西,不过在没有WebSocket之前,要实现从服务器推消息给客户端确实觉得很别扭,比如使用轮询或者长连接的方式,这些方式都会增加客户端和服务端很多负担,都是一些间接的实现方案,但均不理想。而WebSocket协议则是一个真正实现全双工通迅的东西,其也是基于TCP实现,也包含初始的握手过程,但初次握手后可以进行多次数据双向传输过程。本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
WebSocket接口的内容可以分为三类:状态变量、网络功能和消息处理等。本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
构造函数构造WebSocket对象,以及建立和服务器连接; protocols可选字段,代表选择的子协议
状态变量readyState: 代表当前连接的状态,短整型数据,取值为CONNECTING(值为0), OPEN(值为1), CLOSING(值为2), CLOSED(值为3)
方法变量close(code, reason): 关闭此WebSocket连接。
状态变量bufferedAmount: send函数调用后,被缓存并且未发送到网络上的数据长度
方法变量send(data): 将数据data通过此WebSocket发送到对端
回调函数onopen/onmessage/onerror/onclose: 当相应的事件发生时会触发此回调函数本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
以下是代码实现:本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
#服务端的代码实现部分 from typing import List from fastapi import FastAPI, WebSocket, WebSocketDisconnect app = FastAPI() class ConnectionManager: def __init__(self): self.active_connections: List[WebSocket] = [] async def connect(self, ws: WebSocket): await ws.accept() self.active_connections.append(ws) def disconnect(self, ws: WebSocket): self.active_connections.remove(ws) @staticmethod async def send_personal_message(message: str, ws: WebSocket): await ws.send_text(message) async def broadcast(self, message: str): for connection in self.active_connections: await connection.send_text(message) manager = ConnectionManager() @app.websocket("/ws/{user}") async def websocket_endpoint(websocket: WebSocket, user: str): await manager.connect(websocket) await manager.broadcast(f"用户{user}进入聊天室") try: while True: data = await websocket.receive_text() await manager.send_personal_message(f"你说了: {data}", websocket) await manager.broadcast(f"用户:{user} 说: {data}") except WebSocketDisconnect: manager.disconnect(websocket) await manager.broadcast(f"用户-{user}-离开")本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
#客户端的代码实现部分本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>聊天1</title> </head> <body> <h1>User1 Chat</h1> <form action="" onsubmit="sendMessage(event)"> <input type="text" id="messageText" autocomplete="off"/> <button>Send</button> </form> <ul id='messages'> </ul> <script> var ws = new WebSocket("ws://127.0.0.1:8010/ws/user1"); ws.onmessage = function(event) { var messages = document.getElementById('messages') var message = document.createElement('li') var content = document.createTextNode(event.data) message.appendChild(content) messages.appendChild(message) }; function sendMessage(event) { var input = document.getElementById("messageText") ws.send(input.value) input.value = '' event.preventDefault() } </script> </body> </html>本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
要多个客户端就复制一下上面的客户端静态html文件,修改一下new WebSocket参数中最后的user1为user2即可。最后使用官方推荐如下启动方式启动python服务,然后即可在浏览器上实现实时聊天。本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
$ uvicorn main:app --host="127.0.0.1" --port=8010 --reload本文地址:http://www.04007.cn/article/978.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/978.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |