python中websockets与主线程传递参数的实现
作者:Aix959
本文主要介绍了python中websockets与主线程传递参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、子线程创建websockets服务端接收客户端数据并存入队列
发送的消息客户端与服务端统一,多种消息加入判断的标签
服务端:web_server.py
import asyncio import json import base64 import queue import threading import time import cv2 import moment import numpy as np import requests import websockets class WebServer: def __init__(self, host, port): self.host = host self.port = port self.msg_queue = queue.Queue() self.clients = [] self.flag = True async def echo(self, websocket, path): client_ip, client_port = websocket.remote_address self.clients.append(websocket) while True: try: # 在这里处理收到的消息 # async for recv_text in websocket: recv_text = await websocket.recv() with open("aa.txt","w") as f: f.write(recv_text) data = json.loads(recv_text) #if type(data) is not dict: # 判断数据 # continue self.msg_queue.put(res) except websockets.ConnectionClosed: print("ConnectionClosed...", websocket.remote_address) # 链接断开 self.clients.remove(websocket) break except websockets.InvalidState: print("InvalidState...", websocket.remote_address) # 无效状态 self.clients.remove(websocket) break except Exception as err: print("ws:", err) pass def connect(self): asyncio.set_event_loop(asyncio.new_event_loop()) start_server = websockets.serve(self.echo, self.host, self.port) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() print("连接成功!") def run(self): t = threading.Thread(target=self.connect) t.start() print("已启动!")
二、主线程内启动子线程接收并处理数据
收到消息后根据情况处理消息
主线程调用服务端:main.py
from web_server import WebServer class MainThread: def __init__(self): self.ws = WebServer("192.168.6.28", 8000) self.ws.run() def run(self): while True: try: data = self.ws.msg_queue.get() # flag = data.get("flag") # 内容标签 判断是否是自己想要的内容 # if not flag: # continue try: # 处理数据 print(data) pass except Exception as e: print("报错:", e) except Exception as err: print("报错:", err) pass if __name__ == '__main__': M = MainThread() M.run()
客户端:web_client.py
客户端连接服务端,并发送消息
import json import websocket class WebClient: def __init__(self, host, port): self.host = host self.port = port self.conn = None self.flag = False def connect(self): try: url = f"ws://{self.host}:{self.port}" self.conn = websocket.create_connection(url) self.flag = True except Exception as err: self.flag = False def close(self): self.conn.close() def recv(self): data = self.conn.recv(1024) print(data) def send(self, data): self.conn.send(data) if __name__ == '__main__': host = "192.168.6.28" # host = "127.0.0.1" port = 8000 ws = WebClient(host, port) if not ws.flag: ws.connect() with open("bb.txt") as f: data = f.read() ws.send(data)
到此这篇关于python中websockets与主线程传递参数的实现的文章就介绍到这了,更多相关python websockets与主线程传递参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!