Python Websockets庫的使用指南
一、WebSocket 簡介
WebSocket 是一種基于 TCP 的協(xié)議,支持全雙工通信(服務(wù)器和客戶端可以同時發(fā)送消息),適用于實時性要求高的場景(如聊天、實時數(shù)據(jù)監(jiān)控、在線游戲等)。與 HTTP 不同,WebSocket 連接一旦建立,會保持持久化,避免了 HTTP 輪詢的開銷。
二、Python 的 websockets 庫
websockets 是 Python 中用于構(gòu)建 WebSocket 服務(wù)器和客戶端的異步庫,基于 asyncio 實現(xiàn),支持高并發(fā)和低延遲通信。
安裝
pip install websockets
三、完整代碼示例
1. WebSocket 服務(wù)器
import asyncio
import websockets
from datetime import datetime
# 保存所有活躍的客戶端連接
connected_clients = set()
async def handle_client(websocket, path):
"""
處理單個客戶端連接
"""
# 將新客戶端添加到集合
connected_clients.add(websocket)
try:
async for message in websocket:
# 廣播消息給所有客戶端
timestamp = datetime.now().strftime("%H:%M:%S")
broadcast_message = f"[{timestamp}] {message}"
await broadcast(broadcast_message)
except websockets.exceptions.ConnectionClosed:
print("客戶端斷開連接")
finally:
# 客戶端斷開后移除
connected_clients.remove(websocket)
async def broadcast(message):
"""
向所有連接的客戶端廣播消息
"""
if connected_clients:
await asyncio.gather(
*[client.send(message) for client in connected_clients]
)
async def start_server():
"""
啟動 WebSocket 服務(wù)器
"""
async with websockets.serve(handle_client, "localhost", 8765):
print("服務(wù)器已啟動,監(jiān)聽端口 8765...")
await asyncio.Future() # 永久運行
if __name__ == "__main__":
asyncio.run(start_server())
2. WebSocket 客戶端
import asyncio
import websockets
async def client():
"""
WebSocket 客戶端實現(xiàn)
"""
async with websockets.connect("ws://localhost:8765") as websocket:
# 創(chuàng)建兩個任務(wù):一個接收消息,一個發(fā)送消息
receive_task = asyncio.create_task(receive_messages(websocket))
send_task = asyncio.create_task(send_messages(websocket))
await asyncio.gather(receive_task, send_task)
async def receive_messages(websocket):
"""
接收服務(wù)器消息
"""
async for message in websocket:
print(f"\n收到消息: {message}")
async def send_messages(websocket):
"""
發(fā)送用戶輸入的消息
"""
while True:
message = await asyncio.get_event_loop().run_in_executor(None, input, "輸入消息 (輸入 'exit' 退出): ")
if message.strip().lower() == 'exit':
break
await websocket.send(message)
if __name__ == "__main__":
asyncio.run(client())
四、代碼詳解
服務(wù)器端
connected_clients:使用集合保存所有活躍連接,便于廣播。handle_client:- 接受新連接并添加到集合。
- 循環(huán)接收客戶端消息,收到后調(diào)用
broadcast廣播。 - 處理連接斷開異常,確??蛻舳吮灰瞥?。
broadcast:使用asyncio.gather并發(fā)向所有客戶端發(fā)送消息。start_server:啟動服務(wù)器并永久運行。
客戶端
client:連接服務(wù)器并啟動收發(fā)任務(wù)。receive_messages:循環(huán)接收服務(wù)器消息并打印。send_messages:讀取用戶輸入,發(fā)送到服務(wù)器(run_in_executor用于異步處理阻塞的input)。
五、運行與測試
- 啟動服務(wù)器:
python server.py
- 啟動多個客戶端:
python client.py
- 測試:在任一客戶端輸入消息,所有客戶端都會收到廣播。
六、高級用法
- 消息協(xié)議:可定義 JSON 格式的消息,添加類型字段(如
{"type": "chat", "content": "Hello"})。 - 認證:在連接時驗證 Token(通過
path參數(shù)或首次握手消息)。 - 心跳機制:定期發(fā)送 Ping/Pong 保持連接活躍。
- 集成 FastAPI:結(jié)合 ASGI 框架提供 HTTP + WebSocket 混合服務(wù)。
七、應(yīng)用場景
- 實時聊天應(yīng)用
- 多人在線游戲
- 股票行情推送
- 物聯(lián)網(wǎng)設(shè)備監(jiān)控
八、總結(jié)
通過 websockets 庫,可以輕松構(gòu)建高性能的實時應(yīng)用。本文提供的代碼示例覆蓋了服務(wù)器和客戶端的基本實現(xiàn),注釋詳細,可直接擴展用于實際項目。
到此這篇關(guān)于Python Websockets庫的使用指南的文章就介紹到這了,更多相關(guān)Python Websockets庫使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文掌握Python函數(shù)進階:參數(shù)類型與返回值
本文介紹了Python函數(shù)的五種參數(shù)類型,包括位置參數(shù)、默認參數(shù)、可變位置參數(shù)、關(guān)鍵字參數(shù)和可變關(guān)鍵字參數(shù),以及它們的應(yīng)用場景和傳遞細節(jié),本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2026-05-05
Pytorch數(shù)據(jù)拼接與拆分操作實現(xiàn)圖解
這篇文章主要介紹了Pytorch數(shù)據(jù)拼接與拆分操作實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
基于Python實現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)導(dǎo)出工具
這篇文章主要為大家詳細介紹了如何基于Python實現(xiàn)將數(shù)據(jù)庫表結(jié)構(gòu)導(dǎo)出到 Word 文檔的實用工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
python如何爬取網(wǎng)站數(shù)據(jù)并進行數(shù)據(jù)可視化
這篇文章主要介紹了python爬取拉勾網(wǎng)數(shù)據(jù)并進行數(shù)據(jù)可視化,爬取拉勾網(wǎng)關(guān)于python職位相關(guān)的數(shù)據(jù)信息,并將爬取的數(shù)據(jù)已csv各式存入文件,然后對csv文件相關(guān)字段的數(shù)據(jù)進行清洗,并對數(shù)據(jù)可視化展示,包括柱狀圖展示、直方圖展示,需要的朋友可以參考下2019-07-07
PyCharm遠程調(diào)試代碼配置以及運行參數(shù)設(shè)置方式
這篇文章主要介紹了PyCharm遠程調(diào)試代碼配置以及運行參數(shù)設(shè)置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
pandas實現(xiàn)按行遍歷dataframe的方法(itertuples,iterrows)
本文主要介紹了pandas實現(xiàn)按行遍歷dataframe的方法,主要介紹了兩種itertuples,iterrows,具有一定的參考價值,感興趣的可以了解一下2023-08-08
解決python nohup linux 后臺運行輸出的問題
今天小編就為大家分享一篇解決python nohup linux 后臺運行輸出的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

