跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Python Websocket
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Python WebSocket = WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,允许服务器和客户端之间实时交换数据。Python 提供了多种库(如 `websockets` 和 `socket.io`)来实现 WebSocket 功能,适用于实时聊天、在线游戏、股票行情推送等场景。 == 概述 == WebSocket 协议(RFC 6455)在 HTTP 握手后升级为持久连接,克服了传统 HTTP 轮询的低效问题。其核心特点包括: * '''双向通信''':客户端和服务器可主动发送消息。 * '''低延迟''':无需重复建立连接。 * '''轻量级''':数据帧头部开销小(仅 2-10 字节)。 === 与 HTTP 对比 === {| class="wikitable" |- ! 特性 !! WebSocket !! HTTP |- | 连接类型 || 持久化 || 短连接 |- | 数据流向 || 双向 || 单向(请求-响应) |- | 适用场景 || 实时应用 || 静态资源获取 |} == Python 实现 == Python 主流库包括: * {{code|websockets}}(异步) * {{code|Flask-SocketIO}}(基于 Flask) * {{code|Django Channels}}(集成 Django) === 基础示例 === 使用 {{code|websockets}} 库实现简易服务端和客户端: ==== 服务端 ==== <syntaxhighlight lang="python"> import asyncio import websockets async def echo(websocket, path): async for message in websocket: print(f"Received: {message}") await websocket.send(f"Echo: {message}") start_server = websockets.serve(echo, "localhost", 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() </syntaxhighlight> ==== 客户端 ==== <syntaxhighlight lang="python"> import asyncio import websockets async def send_message(): async with websockets.connect("ws://localhost:8765") as ws: await ws.send("Hello WebSocket!") response = await ws.recv() print(f"Server response: {response}") asyncio.get_event_loop().run_until_complete(send_message()) </syntaxhighlight> '''输出:''' <pre> # 服务端 Received: Hello WebSocket! # 客户端 Server response: Echo: Hello WebSocket! </pre> == 高级特性 == === 消息序列化 === 常用 JSON 格式传输结构化数据: <syntaxhighlight lang="python"> import json # 发送端 await websocket.send(json.dumps({"user": "Alice", "action": "join"})) # 接收端 data = json.loads(await websocket.recv()) </syntaxhighlight> === 错误处理 === 捕获连接异常: <syntaxhighlight lang="python"> try: async with websockets.connect("ws://invalid.url") as ws: await ws.send("test") except websockets.exceptions.ConnectionClosedError: print("Connection closed abnormally!") </syntaxhighlight> == 实际案例 == === 实时聊天室 === <mermaid> sequenceDiagram participant ClientA participant Server participant ClientB ClientA->>Server: 发送消息 "Hi" Server->>ClientB: 广播消息 "UserA: Hi" ClientB->>Server: 发送消息 "Hello back" Server->>ClientA: 广播消息 "UserB: Hello back" </mermaid> 实现代码片段: <syntaxhighlight lang="python"> connected_clients = set() async def chat_handler(websocket, path): connected_clients.add(websocket) try: async for message in websocket: for client in connected_clients: if client != websocket: await client.send(f"User: {message}") finally: connected_clients.remove(websocket) </syntaxhighlight> == 性能优化 == * '''心跳机制''':定期发送 ping/pong 帧检测连接存活。 * '''压缩扩展''':启用 {{code|permessage-deflate}} 减少带宽占用。 * '''负载均衡''':横向扩展多节点时使用 Redis 广播消息。 === 数学建模 === 假设每秒消息数 {{math|N}},平均延迟 {{math|L}},则系统吞吐量 {{math|T}} 为: <math>T = \frac{N}{L} \text{ (messages/second)}</math> == 安全考虑 == * '''加密''':始终使用 {{code|wss://}}(WebSocket Secure)。 * '''输入验证''':防止注入攻击。 * '''速率限制''':避免 DDoS 攻击。 == 参见 == * RFC 6455(WebSocket 协议标准) * ASGI(异步服务器网关接口) [[Category:编程语言]] [[Category:Python]] [[Category:Python 网络编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)