天天看點

[5]網絡程式設計-【4】WebSocket程式設計

作者:測開人小江

WebSocket是一種在Web應用程式中實作雙向通信的協定,允許伺服器和用戶端之間進行實時的資料傳輸。在Python中,可以使用websockets庫來進行WebSocket程式設計。本篇将介紹如何使用websockets庫進行Python中WebSocket的學習教程。

安裝websockets庫

在開始之前,需要先安裝websockets庫。可以使用pip指令來安裝:

pip install websockets
           

服務端WebSocket

下面是一個簡單的服務端WebSocket示例,使用websockets庫來監聽用戶端的連接配接請求,并與用戶端進行資料傳輸。

import asyncio
import websockets

async def echo(websocket, path):
    async for message in websocket:
        # 接收用戶端發送的消息
        print(f'Received message: {message}')

        # 發送消息給用戶端
        response = f'Response: {message}'
        await websocket.send(response)

start_server = websockets.serve(echo, 'localhost', 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
           

在以上示例中,使用websockets.serve()函數建立了一個WebSocket伺服器,并指定了監聽的主機位址和端口。echo()函數作為WebSocket處理函數,當用戶端連接配接成功後,将處理用戶端的消息,并發送響應。

用戶端WebSocket

下面是一個簡單的用戶端WebSocket示例,使用websockets庫來連接配接到服務端WebSocket并進行資料傳輸。

import asyncio
import websockets

async def connect():
    async with websockets.connect('ws://localhost:8765') as websocket:
        # 發送消息給服務端
        message = 'Hello, WebSocket!'
        await websocket.send(message)
        print(f'Sent message: {message}')

        # 接收服務端的響應
        response = await websocket.recv()
        print(f'Received response: {response}')

asyncio.get_event_loop().run_until_complete(connect())
           

在以上示例中,使用websockets.connect()函數連接配接到服務端WebSocket,并發送消息給服務端。然後通過websocket.recv()函數接收服務端的響應。

WebSocket事件處理

websockets庫提供了多種事件處理函數,可以用于處理WebSocket的不同僚件,例如連接配接成功、消息接收、連接配接關閉等。下面是一個簡單的示例:

import asyncio
import websockets

async def handle_message(websocket, message):
    print(f'Received message: {message}')
    # 處理消息
    response = f'Response: {message}'
    await websocket.send(response)

async def echo(websocket, path):
    # 處理連接配接成功事件
    print(f'Client connected')
    
    while True:
        try:
            # 接收消息
            message = await websocket.recv()
            await handle_message(websocket, message)
        except websockets.ConnectionClosed:
            # 處理連接配接關閉事件
            print(f'Client disconnected')
            break

start_server = websockets.serve(echo, 'localhost', 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
           

在以上示例中,handle_message()函數用于處理接收到的消息,可以根據實際需求進行自定義處理邏輯。echo()函數通過websockets.serve()建立了一個WebSocket伺服器,并在其中使用一個無限循環來處理接收到的消息。當用戶端連接配接成功時,會觸發連接配接成功事件,并輸出相應的日志。當用戶端斷開連接配接時,會觸發連接配接關閉事件,并輸出相應的日志。

用戶端WebSocket事件處理

websockets庫也提供了用戶端WebSocket的事件處理函數,例如連接配接成功、消息接收、連接配接關閉等。下面是一個簡單的示例:

import asyncio
import websockets

async def handle_response(response):
    print(f'Received response: {response}')
    # 處理服務端的響應

async def connect():
    async with websockets.connect('ws://localhost:8765') as websocket:
        print(f'Connected to server')
        
        while True:
            try:
                # 接收服務端的消息
                response = await websocket.recv()
                await handle_response(response)
            except websockets.ConnectionClosed:
                print(f'Connection closed')
                break

asyncio.get_event_loop().run_until_complete(connect())
           

在以上示例中,handle_response()函數用于處理接收到的服務端響應,可以根據實際需求進行自定義處理邏輯。connect()函數通過websockets.connect()連接配接到服務端WebSocket,并在一個無限循環中處理接收到的消息。當連接配接關閉時,會觸發連接配接關閉事件,并輸出相應的日志。

異常處理

在WebSocket程式設計中,可能會出現各種異常情況,例如連接配接失敗、連接配接關閉、消息發送失敗等。websockets庫提供了相應的異常類,可以用于捕獲和處理這些異常。下面是一個簡單的異常處理示例:

import asyncio
import websockets

async def connect():
    try:
        async with websockets.connect('ws://localhost:8765') as websocket:
            # 發送消息給服務端
            message = 'Hello, WebSocket!'
            await websocket.send(message)
            print(f'Sent message: {message}')

            # 接收服務端的響應
            response = await websocket.recv()
            print(f'Received response: {response}')
    except websockets.exceptions.WebSocketException as e:
        print(f'WebSocket exception: {e}')

asyncio.get_event_loop().run_until_complete(connect())
           

在以上示例中,使用try-except語句來捕獲websockets.exceptions.WebSocketException異常,用于處理WebSocket相關的異常情況,例如連接配接失敗、連接配接關閉等。

總結

通過學習websockets庫的基本用法,可以在Python中進行WebSocket程式設計,實作與Web應用程式的實時資料傳輸。本篇教程介紹了服務端WebSocket的建立、用戶端WebSocket的連接配接與事件處理,以及異常處理等基本概念。希望這個簡單的Python中WebSocket程式設計的學習教程對您有幫助,讓您能夠在實際項目中應用WebSocket技術。