python:3.9.x
- python 依赖
pip3 install asyncio
pip3 install json
pip3 install websockets
pip3 install pyvisa
pip3 install configparser
-case(功能代码模块文件夹) --OutputPower.py(功能代码,接收到客户端信息,判断进入对应的功能模块) -websocket(webSocket服务器代码,主要负责维护连接、接收数据、发送数据) --server.py(服务器代码) -app.py(程序入口)代码
server.py
功能包括:
1、建立websocket连接
2、收取客户端信息
3、发送客户端信息
此处我使用了多线程,主要是想到以后的功能模块交互问题
import asyncio
import websockets
import time
import json
import threading
# 功能模块
from case.OutputPower import OutputPower
# 存储所有的客户端
Clients = []
class Server():
# 发消息给客户端的回调函数
async def s(self,msg,websocket=None):
await self.sendMsg(msg,websocket)
# 针对不同的信息进行请求,可以考虑json文本
async def runCase(self,jsonMsg,websocket):
print('runCase')
# await OutputPower(jsonMsg,self.s,websocket)
op = OutputPower()
await op.run(jsonMsg,self.s,websocket)
# 每一个客户端链接上来就会进一个循环
async def echo(self,websocket, path):
Clients.append(websocket)
await websocket.send(json.dumps({"type": "handshake"}))
while True:
try:
recv_text = await websocket.recv()
message = "I got your message: {}".format(recv_text)
# 直接返回客户端收到的信息
await websocket.send(message)
print(message)
# 分析当前的消息 json格式,跳进功能模块分析
await self.runCase(jsonMsg='',websocket=websocket)
except websockets.ConnectionClosed:
print("ConnectionClosed...", path) # 链接断开
Clients.remove(websocket)
break
except websockets.InvalidState:
print("InvalidState...") # 无效状态
Clients.remove(websocket)
break
except Exception as e:
print(e)
Clients.remove(websocket)
break
# 发送消息
async def sendMsg(self,msg,websocket):
print('sendMsg:',msg)
if websocket != None:
await websocket.send(msg)
else:
await self.broadcastMsg(msg)
# 群发消息
async def broadcastMsg(self,msg):
for user in Clients:
await user.send(msg)
# 启动服务器
async def runServer(self):
async with websockets.serve(self.echo, 'localhost', 8888):
await asyncio.Future() # run forever
# 多线程模式,防止阻塞主线程无法做其他事情
def WebSocketServer(self):
asyncio.run(self.runServer())
def startServer(self):
# 多线程启动,否则会堵塞
thread = threading.Thread(target=self.WebSocketServer)
thread.start()
thread.join()
print("go!!!")
建立功能模块
做到业务分离(OutputPower.py)
import asyncio
class OutputPower():
async def run(self,arg,s,websocket):
# 发送消息方法,单独和请求的客户端发消息
await s('sssss', websocket)
# 群发消息
await s('起来hi')
启动服务
(app.py)
from webSocket.server import Server
if __name__=='__main__':
s = Server()
s.startServer()
测试
直接找一个在线的websocket进行连接测试即可,如 http://www.websocket-test.com/
结果如图:
- 第一个客户端链接
- 发送:12
- 服务器返回:I got your message:12
- 继续返回功能模块的:sssss
- 返回群发的信息:起来hi
- 返回群发的信息:起来hi
- 第二个客户端链接上去
- 重复第一个客户端工作,但是第一个客户端多接收到了一个:起来hi
见:https://download.csdn.net/download/weixin_44635546/85645105



