Python3 网络编程7:WebSocket 编程(双向实时通信)
                           
天天向上
发布: 2025-03-16 12:19:00

原创
783 人浏览过

在传统 HTTP 请求-响应模式下,客户端需要不断轮询服务器以获取最新数据。而 WebSocket 允许服务器和客户端建立全双工通信,适用于实时聊天、在线游戏、股票行情等场景


7.1 WebSocket 基础

Python 提供了 websockets 库,支持 WebSocket 通信。

7.1.1 安装 websockets

pip install websockets

7.1.2 WebSocket 通信流程

  1. 客户端发送连接请求
  2. 服务器响应连接
  3. 双向通信
  4. 任意一方可主动断开连接

7.2 WebSocket 服务器

我们使用 websockets 库创建一个 WebSocket 服务器,监听 0.0.0.0:8765 端口。

import asyncio
import websockets

async def websocket_server(websocket, path):
    print("客户端已连接")
    try:
        async for message in websocket:
            print(f"收到消息: {message}")
            await websocket.send(f"服务器收到: {message}")
    except websockets.exceptions.ConnectionClosed:
        print("客户端断开连接")

start_server = websockets.serve(websocket_server, "0.0.0.0", 8765)

asyncio.run(start_server)

7.3 WebSocket 客户端

import asyncio
import websockets

async def websocket_client():
    async with websockets.connect("ws://127.0.0.1:8765") as websocket:
        await websocket.send("Hello WebSocket Server!")
        response = await websocket.recv()
        print(f"收到服务器响应: {response}")

asyncio.run(websocket_client())

7.4 WebSocket 多客户端支持

7.4.1 服务器支持多个客户端

import asyncio
import websockets

clients = set()

async def websocket_handler(websocket, path):
    clients.add(websocket)
    try:
        async for message in websocket:
            print(f"收到消息: {message}")
            for client in clients:
                if client != websocket:
                    await client.send(f"广播消息: {message}")
    except websockets.exceptions.ConnectionClosed:
        pass
    finally:
        clients.remove(websocket)

start_server = websockets.serve(websocket_handler, "0.0.0.0", 8765)

asyncio.run(start_server)

7.4.2 客户端连接多个 WebSocket

import asyncio
import websockets

async def websocket_client(name):
    async with websockets.connect("ws://127.0.0.1:8765") as websocket:
        await websocket.send(f"{name} 连接成功")
        while True:
            response = await websocket.recv()
            print(f"{name} 收到消息: {response}")

async def main():
    await asyncio.gather(websocket_client("客户端1"), websocket_client("客户端2"))

asyncio.run(main())

7.5 WebSocket 与浏览器通信

可以在前端 HTML 页面中使用 WebSocket 连接服务器。

7.5.1 前端 WebSocket 代码

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>WebSocket 客户端</title>
</head>
<body>
    <h2>WebSocket 连接</h2>
    <button onclick="sendMessage()">发送消息</button>
    <script>
        let ws = new WebSocket("ws://localhost:8765");

        ws.onopen = function () {
            console.log("连接成功!");
        };

        ws.onmessage = function (event) {
            console.log("收到消息: " + event.data);
        };

        function sendMessage() {
            ws.send("Hello from Web!");
        }
    </script>
</body>
</html>

下篇文章我们将介绍 Twisted,用于更高级的网络编程,如 Telnet 服务器!

发表回复 0

Your email address will not be published. Required fields are marked *