102 lines
3.1 KiB
Python
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()
|