first commit
This commit is contained in:
+76
@@ -0,0 +1,76 @@
|
||||
# server.py
|
||||
import asyncio
|
||||
import websockets
|
||||
from datetime import datetime
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
|
||||
clients = set()
|
||||
mac_to_websocket = {}
|
||||
mac_lock = asyncio.Lock()
|
||||
|
||||
|
||||
async def handle_client(websocket):
|
||||
clients.add(websocket)
|
||||
client_ip = websocket.remote_address[0]
|
||||
|
||||
# 解析MAC地址
|
||||
parsed_path = urlparse(websocket.path)
|
||||
query_params = parse_qs(parsed_path.query)
|
||||
mac_addresses = query_params.get("mac", [])
|
||||
if not mac_addresses:
|
||||
print(f"[{datetime.now().strftime('%H:%M:%S')}] 客户端未提供MAC地址,断开连接")
|
||||
clients.remove(websocket)
|
||||
await websocket.close()
|
||||
return
|
||||
mac_address = mac_addresses[0]
|
||||
|
||||
# 处理已存在的同MAC连接
|
||||
async with mac_lock:
|
||||
if mac_address in mac_to_websocket:
|
||||
old_ws = mac_to_websocket[mac_address]
|
||||
if old_ws.open:
|
||||
await old_ws.close()
|
||||
clients.remove(old_ws)
|
||||
mac_to_websocket[mac_address] = websocket
|
||||
|
||||
print(
|
||||
f"[{datetime.now().strftime('%H:%M:%S')}] 新客户端接入 | MAC: {mac_address} | IP: {client_ip} | 总数: {len(clients)}"
|
||||
)
|
||||
|
||||
try:
|
||||
async for message in websocket:
|
||||
print(
|
||||
f"[{datetime.now().strftime('%H:%M:%S')}] 收到来自 {mac_address} 的消息: {message}"
|
||||
)
|
||||
# 解析目标MAC地址和消息内容
|
||||
if "|" not in message:
|
||||
print(f"无效消息格式: {message}")
|
||||
continue
|
||||
target_mac, content = message.split("|", 1)
|
||||
async with mac_lock:
|
||||
target_ws = mac_to_websocket.get(target_mac)
|
||||
if target_ws and target_ws.open:
|
||||
await target_ws.send(f"[{mac_address}] {content}")
|
||||
else:
|
||||
print(f"目标MAC {target_mac} 未找到或连接已关闭")
|
||||
finally:
|
||||
async with mac_lock:
|
||||
if (
|
||||
mac_address in mac_to_websocket
|
||||
and mac_to_websocket[mac_address] == websocket
|
||||
):
|
||||
del mac_to_websocket[mac_address]
|
||||
clients.remove(websocket)
|
||||
print(
|
||||
f"[{datetime.now().strftime('%H:%M:%S')}] 客户端断开 | MAC: {mac_address} | 剩余: {len(clients)}"
|
||||
)
|
||||
|
||||
|
||||
async def main():
|
||||
async with websockets.serve(handle_client, "0.0.0.0", 8765):
|
||||
print("WebSocket服务器已启动 ws://0.0.0.0:8765")
|
||||
await asyncio.Future() # 永久运行
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user