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

使用Python實(shí)現(xiàn)WebSocket服務(wù)器與客戶端通信功能

 更新時(shí)間:2024年12月20日 08:29:27   作者:小噔小咚什么東東  
WebSocket?是一種基于?TCP?協(xié)議的通信協(xié)議,能夠在客戶端與服務(wù)器之間進(jìn)行全雙工(雙向)通信,相比傳統(tǒng)的?HTTP?協(xié)議,WebSocket?可以實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)的傳輸,我通過?Python?實(shí)現(xiàn)一個(gè)簡單的?WebSocket?服務(wù)器,并使其與客戶端進(jìn)行通信,需要的朋友可以參考下

簡介

WebSocket 是一種基于 TCP 協(xié)議的通信協(xié)議,能夠在客戶端與服務(wù)器之間進(jìn)行全雙工(雙向)通信。相比傳統(tǒng)的 HTTP 協(xié)議,WebSocket 可以實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)的傳輸,尤其適合需要實(shí)時(shí)交互的應(yīng)用場景,如在線游戲、實(shí)時(shí)聊天、金融交易等。

我通過 Python 實(shí)現(xiàn)一個(gè)簡單的 WebSocket 服務(wù)器,并使其與客戶端進(jìn)行通信。我們將創(chuàng)建兩個(gè) Python 文件:websocket.pymain.pywebsocket.py 負(fù)責(zé)實(shí)現(xiàn) WebSocket 服務(wù)器的功能,main.py 負(fù)責(zé)啟動(dòng)和管理服務(wù)器,以及定時(shí)向客戶端發(fā)送消息。

安裝 WebSocket 庫

在開始之前,需要安裝 websockets 庫,它是 Python 中非常流行的 WebSocket 實(shí)現(xiàn)。

pip install websockets

websocket.py — WebSocket 服務(wù)器實(shí)現(xiàn)

在 websocket.py 文件中,我定義了一個(gè) WebSocketServer 類,包含了 WebSocket 服務(wù)器的主要邏輯。

代碼解析

import asyncio
import websockets

class WebSocketServer:
    def __init__(self, host="localhost", port=8765):
        self.host = host
        self.port = port
        self.clients = set()  # 存儲(chǔ)所有連接的客戶端

首先,我創(chuàng)建了一個(gè) WebSocketServer 類,它的構(gòu)造方法初始化了服務(wù)器的主機(jī)地址 host 和端口號(hào) port,同時(shí)維護(hù)了一個(gè)客戶端集合 clients 來存儲(chǔ)當(dāng)前連接的 WebSocket 客戶端。

    async def handle_client(self, websocket):
        # 新的客戶端連接
        self.clients.add(websocket)
        try:
            async for message in websocket:
                print(f"收到消息: {message}")
                # 回顯消息給客戶端
                await websocket.send(f"服務(wù)器已收到: {message}")
        except websockets.ConnectionClosed as e:
            print(f"客戶端斷開連接: {e}")
        finally:
            # 移除斷開的客戶端
            self.clients.remove(websocket)

handle_client 是一個(gè)異步方法,用來處理與客戶端的連接。在客戶端發(fā)送消息時(shí),服務(wù)器會(huì)接收到該消息,并通過 websocket.send() 方法將回顯消息發(fā)送給客戶端。如果客戶端斷開連接,捕獲到 ConnectionClosed 異常,并從 clients 集合中移除該客戶端。

    async def send(self, message):
        """向所有連接的客戶端發(fā)送消息"""
        if not self.clients:
            print("沒有客戶端連接,無法發(fā)送消息")
            return
        disconnected_clients = set()
        for client in self.clients:
            try:
                await client.send(message)
            except websockets.ConnectionClosed:
                disconnected_clients.add(client)
        # 清理已斷開的客戶端
        self.clients -= disconnected_clients

send 方法允許服務(wù)器向所有連接的客戶端發(fā)送消息。如果有客戶端斷開連接,服務(wù)器會(huì)將其從 clients 集合中移除。

    async def start(self):
        print(f"啟動(dòng) WebSocket 服務(wù)器: ws://{self.host}:{self.port}")
        async with websockets.serve(self.handle_client, self.host, self.port):
            await asyncio.Future()  # 持續(xù)運(yùn)行直到手動(dòng)停止

start 方法啟動(dòng) WebSocket 服務(wù)器,通過 websockets.serve() 啟動(dòng)一個(gè) WebSocket 服務(wù),該服務(wù)會(huì)監(jiān)聽來自客戶端的連接請(qǐng)求,并調(diào)用 handle_client 方法處理這些請(qǐng)求。await asyncio.Future() 會(huì)讓服務(wù)器持續(xù)運(yùn)行,直到手動(dòng)停止。

main.py — 啟動(dòng) WebSocket 服務(wù)器并定時(shí)發(fā)送消息

main.py 文件中,創(chuàng)建了一個(gè) WebSocket 服務(wù)器的實(shí)例,并啟動(dòng)了一個(gè)定時(shí)任務(wù),定期向連接的客戶端發(fā)送消息。

代碼解析

import asyncio
from websocket import WebSocketServer

async def main():
    # 創(chuàng)建 WebSocket 服務(wù)器實(shí)例
    websocket_server = WebSocketServer()
    websocket_task = asyncio.create_task(websocket_server.start())  # 啟動(dòng) WebSocket 服務(wù)器

在 main() 函數(shù)中,首先創(chuàng)建了 WebSocketServer 的實(shí)例,并啟動(dòng)了 WebSocket 服務(wù)器。

    # 定時(shí)向 WebSocket 客戶端發(fā)送數(shù)據(jù)
    async def send_data_periodically():
        while True:
            await asyncio.sleep(5)  # 每 5 秒發(fā)送一次數(shù)據(jù)
            await websocket_server.send("服務(wù)器定時(shí)發(fā)送消息:ping")

send_data_periodically 是一個(gè)定時(shí)任務(wù),每隔 5 秒就向所有連接的客戶端發(fā)送一次 "服務(wù)器定時(shí)發(fā)送消息:ping"。

    periodic_task = asyncio.create_task(send_data_periodically())
    # 并發(fā)運(yùn)行所有任務(wù)
    await asyncio.gather(websocket_task, periodic_task)

通過 asyncio.create_task() 啟動(dòng)了定時(shí)任務(wù),并通過 asyncio.gather() 并發(fā)運(yùn)行 WebSocket 服務(wù)器和定時(shí)發(fā)送消息的任務(wù)。

if __name__ == "__main__":
    asyncio.run(main())

最后,我們 asyncio.run(main()) 啟動(dòng)了整個(gè)程序。

總結(jié)

通過這兩個(gè)文件,實(shí)現(xiàn)了一個(gè)簡單的 WebSocket 服務(wù)器,該服務(wù)器能夠接收客戶端消息并進(jìn)行回顯。同時(shí),服務(wù)器也能夠定時(shí)向所有連接的客戶端發(fā)送消息。

完整代碼

websocket.py

import asyncio
import websockets

class WebSocketServer:
    def __init__(self, host="localhost", port=8765):
        self.host = host
        self.port = port
        self.clients = set()  # 存儲(chǔ)所有連接的客戶端

    async def handle_client(self, websocket):
        # 新的客戶端連接
        self.clients.add(websocket)
        try:
            async for message in websocket:
                print(f"收到消息: {message}")
                # 回顯消息給客戶端
                await websocket.send(f"服務(wù)器已收到: {message}")
        except websockets.ConnectionClosed as e:
            print(f"客戶端斷開連接: {e}")
        finally:
            # 移除斷開的客戶端
            self.clients.remove(websocket)

    async def send(self, message):
        """向所有連接的客戶端發(fā)送消息"""
        if not self.clients:
            print("沒有客戶端連接,無法發(fā)送消息")
            return
        disconnected_clients = set()
        for client in self.clients:
            try:
                await client.send(message)
            except websockets.ConnectionClosed:
                disconnected_clients.add(client)
        # 清理已斷開的客戶端
        self.clients -= disconnected_clients

    async def start(self):
        print(f"啟動(dòng) WebSocket 服務(wù)器: ws://{self.host}:{self.port}")
        async with websockets.serve(self.handle_client, self.host, self.port):
            await asyncio.Future()  # 持續(xù)運(yùn)行直到手動(dòng)停止

main.py

import asyncio
from websocket import WebSocketServer


async def main():
    # 創(chuàng)建 WebSocket 服務(wù)器實(shí)例
    websocket_server = WebSocketServer()
    websocket_task = asyncio.create_task(websocket_server.start())  # 啟動(dòng) WebSocket 服務(wù)器

    # 定時(shí)向 WebSocket 客戶端發(fā)送數(shù)據(jù)
    async def send_data_periodically():
        while True:
            await asyncio.sleep(5)  # 每 5 秒發(fā)送一次數(shù)據(jù)
            await websocket_server.send("服務(wù)器定時(shí)發(fā)送消息:ping")

    periodic_task = asyncio.create_task(send_data_periodically())

    # 并發(fā)運(yùn)行所有任務(wù)
    await asyncio.gather(websocket_task, periodic_task)


if __name__ == "__main__":
    asyncio.run(main())

以上就是使用Python實(shí)現(xiàn)WebSocket服務(wù)器與客戶端通信的詳細(xì)內(nèi)容,更多關(guān)于Python WebSocket通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python的函數(shù)使用示例詳解

    Python的函數(shù)使用示例詳解

    在Python的函數(shù)中,我們將其分為內(nèi)置函數(shù)、自定義函數(shù)、main函數(shù)三個(gè)模塊,當(dāng)然,使用的過程中會(huì)涉及到變量以及參數(shù),這些都會(huì)舉例進(jìn)行說明,對(duì)Python函數(shù)使用相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • python實(shí)現(xiàn)在函數(shù)中修改變量值的方法

    python實(shí)現(xiàn)在函數(shù)中修改變量值的方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)在函數(shù)中修改變量值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python獲取百度熱榜鏈接的實(shí)例方法

    python獲取百度熱榜鏈接的實(shí)例方法

    在本篇文章里小編給大家整理了關(guān)于python獲取百度熱榜鏈接的實(shí)例方法,需要的朋友們可以學(xué)習(xí)參考下。
    2020-08-08
  • Python 轉(zhuǎn)換數(shù)據(jù)類型函數(shù)和轉(zhuǎn)換數(shù)據(jù)類型的作用

    Python 轉(zhuǎn)換數(shù)據(jù)類型函數(shù)和轉(zhuǎn)換數(shù)據(jù)類型的作用

    這篇文章主要介紹了Python 轉(zhuǎn)換數(shù)據(jù)類型函數(shù)和轉(zhuǎn)換數(shù)據(jù)類型的作用,圍繞Python 轉(zhuǎn)換數(shù)據(jù)類型的相關(guān)資料展開內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • python3 如何解壓縮.gz文件

    python3 如何解壓縮.gz文件

    這篇文章主要介紹了python3 如何解壓縮.gz文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Python之打印日志庫(logging)

    Python之打印日志庫(logging)

    這篇文章主要介紹了Python之打印日志庫(logging),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python進(jìn)行參數(shù)傳遞的方法

    python進(jìn)行參數(shù)傳遞的方法

    在本篇文章里小編給大家分享的是關(guān)于python進(jìn)行參數(shù)傳遞的方法以及代碼,需要的朋友們可以學(xué)習(xí)下。
    2020-05-05
  • python進(jìn)階教程之模塊(module)介紹

    python進(jìn)階教程之模塊(module)介紹

    這篇文章主要介紹了python進(jìn)階教程之模塊(module)介紹,本文講解了基礎(chǔ)知識(shí)、引用方法、搜索的路徑、模塊包等知識(shí),需要的朋友可以參考下
    2014-08-08
  • 詳解Python類的定義與實(shí)例

    詳解Python類的定義與實(shí)例

    這篇文章給大家介紹Python類的定義與實(shí)例,下面是一個(gè)使用?NewSpaceGraph?類的示例,展示了如何實(shí)例化該類并調(diào)用其方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • python實(shí)現(xiàn)的簡單FTP上傳下載文件實(shí)例

    python實(shí)現(xiàn)的簡單FTP上傳下載文件實(shí)例

    這篇文章主要介紹了python實(shí)現(xiàn)的簡單FTP上傳下載文件的方法,實(shí)例分析了Python基于FTP模塊實(shí)現(xiàn)文件傳輸?shù)募记?需要的朋友可以參考下
    2015-06-06

最新評(píng)論

买车| 屯昌县| 铜鼓县| 延川县| 静海县| 库车县| 普格县| 麦盖提县| 湟中县| 金山区| 望城县| 通化县| 荃湾区| 金溪县| 秦皇岛市| 白沙| 阿拉尔市| 璧山县| 平湖市| 韶关市| 防城港市| 华蓥市| 福安市| 伊宁市| 双辽市| 丹寨县| 镶黄旗| 视频| 理塘县| 枣阳市| 津南区| 休宁县| 浦东新区| 周至县| 固镇县| 勐海县| 西青区| 吴堡县| 亚东县| 台东县| 兴隆县|