最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中實(shí)現(xiàn)WebSocket的示例詳解

 更新時間:2025年03月10日 15:59:27   作者:王子良.  
WebSocket 是一種計(jì)算機(jī)通信協(xié)議,它為客戶端和服務(wù)器之間的雙向通信提供了一個全雙工的通道,本篇文章將詳解 Python 中如何實(shí)現(xiàn) WebSocket,感興趣的可以了解下

WebSocket 是一種計(jì)算機(jī)通信協(xié)議,它為客戶端和服務(wù)器之間的雙向通信提供了一個全雙工的通道。通過 WebSocket,客戶端和服務(wù)器可以在一個長期的連接中保持通信,而無需每次都建立新的連接。這個特性在實(shí)時聊天、在線游戲、股票行情等應(yīng)用中非常有用。

本篇文章將詳解 Python 中如何實(shí)現(xiàn) WebSocket,內(nèi)容包括 WebSocket 的基礎(chǔ)概念、Python 中的 WebSocket 庫、簡單的客戶端和服務(wù)器端代碼示例、以及一些高級使用場景。

1. WebSocket 基礎(chǔ)概念

WebSocket 協(xié)議最初是由 IETF(Internet Engineering Task Force)發(fā)布的,目的是提供一個更高效的通信協(xié)議,可以通過單個長連接在客戶端和服務(wù)器之間進(jìn)行雙向通信。WebSocket 的通信通過在 HTTP 協(xié)議上建立一個持久連接(即 WebSocket 握手),并且支持全雙工通信,即數(shù)據(jù)可以同時從客戶端發(fā)送到服務(wù)器,也可以從服務(wù)器發(fā)送到客戶端。

WebSocket 與傳統(tǒng)的 HTTP 協(xié)議有很大的不同。HTTP 是一個請求-響應(yīng)式的協(xié)議,客戶端每次需要獲取數(shù)據(jù)時都需要向服務(wù)器發(fā)送請求,而 WebSocket 則是通過一個初始握手請求將通信通道建立起來,之后雙方可以隨時發(fā)送數(shù)據(jù)。

WebSocket 握手過程:

  • 客戶端向服務(wù)器發(fā)起一個 HTTP 請求,并要求升級到 WebSocket 協(xié)議。
  • 服務(wù)器響應(yīng)客戶端的請求,確認(rèn)升級協(xié)議。
  • 客戶端和服務(wù)器建立 WebSocket 連接,可以開始全雙工通信。

2. Python WebSocket 庫

在 Python 中,我們通常使用以下幾種庫來實(shí)現(xiàn) WebSocket:

  • websockets:一個輕量級的 Python WebSocket 實(shí)現(xiàn),支持異步編程。
  • socket.io:一個更為高級的庫,支持事件驅(qū)動和自動重連等特性,常用于實(shí)時應(yīng)用。
  • asyncio:雖然 asyncio 本身并不是一個 WebSocket 庫,但它為 WebSocket 的異步編程提供了基礎(chǔ)支持。

在本篇文章中,我們將主要介紹 websockets 庫,并使用它來實(shí)現(xiàn) WebSocket 客戶端和服務(wù)器。

3. 安裝 websockets 庫

在使用 websockets 庫之前,我們需要先安裝它??梢酝ㄟ^ pip 來安裝:

pip install websockets

4. WebSocket 服務(wù)器端實(shí)現(xiàn)

創(chuàng)建 WebSocket 服務(wù)器

WebSocket 服務(wù)器通常運(yùn)行在一個特定的端口,并等待客戶端的連接請求。我們可以通過 websockets 庫來實(shí)現(xiàn)一個簡單的 WebSocket 服務(wù)器。

import asyncio
import websockets
 
async def handle_connection(websocket, path):
    # 接收到客戶端的消息
    print(f"Connected to {websocket.remote_address}")
    try:
        async for message in websocket:
            print(f"Received message: {message}")
            # 發(fā)送消息回客戶端
            await websocket.send(f"Server received: {message}")
    except Exception as e:
        print(f"Error: {e}")
    finally:
        print(f"Disconnected from {websocket.remote_address}")
 
async def main():
    # 啟動 WebSocket 服務(wù)器,監(jiān)聽 8765 端口
    server = await websockets.serve(handle_connection, "localhost", 8765)
    print("WebSocket server started on ws://localhost:8765")
    await server.wait_closed()
 
# 啟動事件循環(huán)
asyncio.run(main())

代碼說明

handle_connection 是處理每個客戶端連接的異步函數(shù)。每當(dāng)有客戶端連接時,服務(wù)器將接收到的消息打印出來,并將消息返回給客戶端。

websockets.serve() 用于啟動 WebSocket 服務(wù)器,監(jiān)聽指定的地址和端口(此處為 localhost 和 8765)。

await server.wait_closed() 保證服務(wù)器持續(xù)運(yùn)行,直到手動關(guān)閉。

5. WebSocket 客戶端實(shí)現(xiàn)

創(chuàng)建 WebSocket 客戶端

WebSocket 客戶端用于與服務(wù)器建立連接,并發(fā)送和接收消息。我們使用 websockets.connect 來連接到服務(wù)器。

import asyncio
import websockets
 
async def send_message():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        # 向服務(wù)器發(fā)送消息
        await websocket.send("Hello, Server!")
        print("Message sent to server.")
        
        # 接收服務(wù)器返回的消息
        response = await websocket.recv()
        print(f"Received from server: {response}")
 
# 啟動事件循環(huán)
asyncio.run(send_message())

代碼說明

websockets.connect(uri) 用于與 WebSocket 服務(wù)器建立連接。uri 是服務(wù)器的地址,此處為 ws://localhost:8765。

使用 await websocket.send() 向服務(wù)器發(fā)送消息。

使用 await websocket.recv() 接收來自服務(wù)器的消息。

6. 異常處理

在實(shí)際應(yīng)用中,WebSocket 連接可能會因?yàn)榫W(wǎng)絡(luò)中斷、服務(wù)器關(guān)閉等原因而失敗。我們可以在客戶端和服務(wù)器端都加入適當(dāng)?shù)漠惓L幚怼?/p>

6.1 客戶端異常處理

async def send_message():
    uri = "ws://localhost:8765"
    try:
        async with websockets.connect(uri) as websocket:
            await websocket.send("Hello, Server!")
            print("Message sent to server.")
            response = await websocket.recv()
            print(f"Received from server: {response}")
    except websockets.exceptions.ConnectionClosed as e:
        print(f"Connection closed: {e}")
    except Exception as e:
        print(f"Error: {e}")
 
asyncio.run(send_message())

6.2 服務(wù)器端異常處理

async def handle_connection(websocket, path):
    print(f"Connected to {websocket.remote_address}")
    try:
        async for message in websocket:
            print(f"Received message: {message}")
            await websocket.send(f"Server received: {message}")
    except websockets.exceptions.ConnectionClosed as e:
        print(f"Connection closed: {e}")
    except Exception as e:
        print(f"Error: {e}")
    finally:
        print(f"Disconnected from {websocket.remote_address}")

7. WebSocket 高級使用

7.1. 廣播消息

如果你想讓服務(wù)器向所有已連接的客戶端廣播消息,可以維護(hù)一個客戶端列表并發(fā)送消息。

clients = set()
 
async def handle_connection(websocket, path):
    clients.add(websocket)
    try:
        async for message in websocket:
            print(f"Received message: {message}")
            # 廣播消息給所有客戶端
            for client in clients:
                if client != websocket:
                    await client.send(f"Broadcast message: {message}")
    except Exception as e:
        print(f"Error: {e}")
    finally:
        clients.remove(websocket)
        print(f"Disconnected from {websocket.remote_address}")

7.2. 認(rèn)證和授權(quán)

你可以使用 WebSocket 協(xié)議的初始握手階段進(jìn)行認(rèn)證和授權(quán),比如使用 HTTP header 傳遞認(rèn)證信息。

async def handle_connection(websocket, path):
    headers = websocket.request_headers
    token = headers.get('Authorization')
    if token != "expected_token":
        await websocket.send("Unauthorized")
        await websocket.close()
        return
    print(f"Client authorized with token: {token}")
    # 處理正常的消息

8. 總結(jié)

本文詳細(xì)介紹了如何在 Python 中使用 websockets 庫實(shí)現(xiàn) WebSocket 服務(wù)端和客戶端,涉及到的主要概念包括:

WebSocket 協(xié)議基礎(chǔ)及其優(yōu)勢;

如何實(shí)現(xiàn) WebSocket 服務(wù)器和客戶端;

如何處理異常、進(jìn)行消息廣播和認(rèn)證等高級應(yīng)用。

以上就是Python中實(shí)現(xiàn)WebSocket的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python WebSocket的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • pyqt QGraphicsView 以鼠標(biāo)為中心進(jìn)行縮放功能實(shí)現(xiàn)

    pyqt QGraphicsView 以鼠標(biāo)為中心進(jìn)行縮放功能實(shí)現(xiàn)

    在PyQt開發(fā)中,實(shí)現(xiàn)QGraphicsView的鼠標(biāo)中心縮放功能需要注意初始化以及關(guān)鍵函數(shù)的重定義,遇到不達(dá)預(yù)期的效果時,可能需要重寫所有鼠標(biāo)事件,本文記錄了解決QGraphicsView鼠標(biāo)縮放問題的過程,供開發(fā)者參考
    2024-10-10
  • Python入門教程(十八)Python的For循環(huán)

    Python入門教程(十八)Python的For循環(huán)

    這篇文章主要介紹了Python入門教程(十八)Python的For循環(huán),Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04
  • Python中的類對象示例詳解

    Python中的類對象示例詳解

    這篇文章主要介紹了Python中類對象示例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 為什么python比較流行

    為什么python比較流行

    在本篇文章里小編給大家分析了關(guān)于python比較流行的原因以及優(yōu)勢等,需要的朋友們可以參考下。
    2020-06-06
  • TensorFlow?環(huán)境搭建的實(shí)現(xiàn)示例

    TensorFlow?環(huán)境搭建的實(shí)現(xiàn)示例

    本文介紹了TensorFlow環(huán)境搭建與使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • Python實(shí)現(xiàn)FIFO緩存置換算法

    Python實(shí)現(xiàn)FIFO緩存置換算法

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)FIFO(先進(jìn)先出)緩存置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 如何利用Pytorch計(jì)算三角函數(shù)

    如何利用Pytorch計(jì)算三角函數(shù)

    這篇文章主要介紹了如何利用Pytorch計(jì)算三角函數(shù),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 初步解析Python中的yield函數(shù)的用法

    初步解析Python中的yield函數(shù)的用法

    這篇文章主要介紹了Python中的yield函數(shù),yield函數(shù)是生成器中的一個常用函數(shù),本文來自于IBM官方網(wǎng)站的開發(fā)者文檔的翻譯,需要的朋友可以參考下
    2015-04-04
  • 用python 實(shí)現(xiàn)在不確定行數(shù)情況下多行輸入方法

    用python 實(shí)現(xiàn)在不確定行數(shù)情況下多行輸入方法

    今天小編就為大家分享一篇用python 實(shí)現(xiàn)在不確定行數(shù)情況下多行輸入方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 使用Python實(shí)現(xiàn)自動創(chuàng)建Excel折線圖

    使用Python實(shí)現(xiàn)自動創(chuàng)建Excel折線圖

    在數(shù)據(jù)分析,財(cái)務(wù)報(bào)告和市場研究中,折線圖能夠清晰地呈現(xiàn)數(shù)據(jù)的波動模式和增長趨勢,本文小編就和大家介紹一下如何使用 Python 在 Excel 工作簿中創(chuàng)建折線圖并對其進(jìn)行各種自定義設(shè)置吧
    2026-05-05

最新評論

隆回县| 基隆市| 昌邑市| 安龙县| 泽州县| 福清市| 永嘉县| 新建县| 铁岭市| 岱山县| 洮南市| 河东区| 福泉市| 古蔺县| 中山市| 宾川县| 鄂伦春自治旗| 东莞市| 女性| 岗巴县| 沿河| 九龙县| 枣庄市| 天长市| 肇源县| 天水市| 安国市| 山丹县| 奉新县| 台湾省| 嘉荫县| 扶沟县| 洪湖市| 资兴市| 准格尔旗| 灵丘县| 临清市| 白沙| 扶风县| 新晃| 龙门县|