sample_code/py_socket_demo/WebSocket_Server.py
2025-03-24 18:03:40 +08:00

102 lines
3.1 KiB
Python

#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
# @Author :幸运锦鲤
# @Time : 2025-03-24 17:30:27
# @version : python3
# @Update time :
# @Description : WebSocket服务器端示例代码
# @env : pip install websockets
'''
import asyncio
import websockets
class WebSocketServer:
def __init__(self, host='0.0.0.0', port=8765):
"""
初始化 WebSocket 服务端
:param host: 监听的 IP 地址,默认为 '0.0.0.0'
:param port: 监听的端口号,默认为 8765
"""
self.host = host
self.port = port
self.clients = set() # 存储所有连接的客户端
async def handle_client(self, websocket, path):
"""
处理客户端连接
:param websocket: 客户端 WebSocket 连接对象
:param path: 客户端请求的路径(可选)
"""
# 添加客户端到集合中
self.clients.add(websocket)
print(f"[+] 客户端已连接: {websocket.remote_address}")
try:
async for message in websocket:
print(f"[*] 收到来自 {websocket.remote_address} 的消息: {message}")
# 自定义处理逻辑
response = self.process_message(message)
# 将响应发送回客户端
await websocket.send(response)
except websockets.exceptions.ConnectionClosed:
print(f"[-] 客户端断开连接: {websocket.remote_address}")
finally:
# 移除客户端
self.clients.remove(websocket)
def process_message(self, message):
"""
自定义消息处理逻辑
:param message: 客户端发送的消息
:return: 要返回给客户端的响应
"""
# 默认实现:回显消息
return message
async def broadcast(self, message):
"""
广播消息给所有连接的客户端
:param message: 要广播的消息
"""
if not self.clients:
print("[!] 没有客户端连接,无法广播消息.")
return
print(f"[*] 广播消息: {message}")
for client in self.clients:
try:
await client.send(message)
except Exception as e:
print(f"[!] 向 {client.remote_address} 发送消息失败: {e}")
def start(self):
"""
启动 WebSocket 服务端
"""
print(f"[*] WebSocket 服务端正在监听 ws://{self.host}:{self.port} ...")
server = websockets.serve(self.handle_client, self.host, self.port)
asyncio.get_event_loop().run_until_complete(server)
asyncio.get_event_loop().run_forever()
def stop(self):
"""
停止 WebSocket 服务端
"""
print("[*] 正在停止 WebSocket 服务端...")
asyncio.get_event_loop().stop()
# 测试代码
if __name__ == "__main__":
server = WebSocketServer(host='0.0.0.0', port=8765)
try:
server.start()
except KeyboardInterrupt:
print("\n[!] 正在关闭服务端...")
server.stop()