websocket服务端和客户端初始版

This commit is contained in:
haotian 2025-06-16 17:14:44 +08:00
commit 811de8d76f
3 changed files with 120 additions and 0 deletions

50
webSocketClient.py Normal file
View File

@ -0,0 +1,50 @@
import websockets
import asyncio
from aioconsole import ainput # 使用异步输入库
class WebSocketClient:
def __init__(self, url):
self.url = url
async def run(self):
try:
async with websockets.connect(self.url) as websocket:
print("Connected to server.")
sender = asyncio.create_task(self.send_messages(websocket))
receiver = asyncio.create_task(self.receive_messages(websocket))
await asyncio.gather(sender, receiver)
except Exception as e:
print(f"Error: {e}")
async def send_messages(self, websocket):
"""使用异步输入处理用户输入"""
try:
while True:
# 使用aioconsole的异步输入避免阻塞
message = await ainput("Enter message (or 'exit' to quit): ")
if message.lower() == "exit":
await websocket.close()
break
await websocket.send(message)
except asyncio.CancelledError:
pass # 任务被取消时正常退出
except Exception as e:
print(f"Send error: {e}")
async def receive_messages(self, websocket):
"""优化消息显示格式"""
try:
while True:
message = await websocket.recv()
# 使用ANSI转义码清除当前行并打印服务器消息
print(f"\r\033[K[Server] {message}", flush=True)
# 重新显示输入提示
print("Enter message (or 'exit' to quit): ", end="", flush=True)
except websockets.exceptions.ConnectionClosed:
print("\nConnection closed.")
except asyncio.CancelledError:
pass # 任务被取消时正常退出
if __name__ == "__main__":
client = WebSocketClient("ws://10.0.0.202:8788")
asyncio.run(client.run())

20
webSocketServer_0.py Normal file
View File

@ -0,0 +1,20 @@
import websockets
import asyncio
import time
async def echo_server(websocket):
print("Client connected.")
try:
async for message in websocket:
print(f"Received: {message}")
response = f"Echo: {message}"
await websocket.send(response)
except websockets.exceptions.ConnectionClosed:
print("Client disconnected.")
async def main():
async with websockets.serve(echo_server, "10.0.0.202", 8788):
await asyncio.Future() # 永久运行
asyncio.run(main())

50
webSocketServer_1.py Normal file
View File

@ -0,0 +1,50 @@
'''
服务端定时向客户端发送消息
'''
import asyncio
import websockets
from datetime import datetime
# 存储所有连接的客户端
connected_clients = set()
async def send_periodic_messages(interval=5):
"""定期向所有客户端发送消息"""
while True:
await asyncio.sleep(interval)
if connected_clients:
# message = "{'socketType':'7','number':'ROB23100098','groupingId':'0dc1ad7fdb394246981b8576465240ce','onlineStatus':'1','robotId':'6865c4ce61ee45a69e79f62eee55b83c'}"
message = "{\"socketType\":\"7\",\"number\":\"ROB23100098\",\"groupingId\":\"0dc1ad7fdb394246981b8576465240ce\",\"onlineStatus\":\"1\",\"robotId\":\"6865c4ce61ee45a69e79f62eee55b83c\"}"
# 6865c4ce61ee45a69e79f62eee55b83c
# 向所有客户端广播消息
await asyncio.wait([client.send(message) for client in connected_clients])
async def handle_client(websocket, path):
"""处理客户端连接"""
# 添加新客户端
connected_clients.add(websocket)
try:
# 保持连接开放
async for message in websocket:
# 可选的:处理客户端发来的消息
print(f"Received: {message}")
finally:
# 客户端断开时移除
connected_clients.remove(websocket)
async def main():
# 启动定时任务
asyncio.create_task(send_periodic_messages(interval=10))
# 启动WebSocket服务器
server = await websockets.serve(
handle_client,
"10.0.0.202",
8788
)
print("WebSocket server started on ws://10.0.0.202:8788")
await server.wait_closed()
if __name__ == "__main__":
asyncio.run(main())