python udp 线程接受 demo

udp使用socketserver 接受简单方便

使用是python 的threading 快速构建udp 接受线程

使用 pyqt5的QThread,用于发现信号到ui线程,跟新ui

使用queue接受udp数据,并通过queue在 udp接受线程和数据解析线程间数据传递。

复制代码
from socketserver import*
import threading
import time
import sys
from queue import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import *
'''udp REC线程'''
class MyUDPServer(UDPServer):
    def __init__(self, server_address, RequestHandlerClass, queue):
        self.udp_queue = queue  # 增加的参数
        UDPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)


class Handler(BaseRequestHandler):
    def handle(self):
        self.data = self.request[0].strip()
        self.server.udp_queue.put(self.data)
        # print(self.server.udp_queue.get())
        # print(self.data)

'''DATA 解析 线程'''
class mythread(QThread):
    signal = pyqtSignal(bytes)
    def __init__(self,queue,rec_data_Instance):
        super( mythread,self).__init__()
        self.running = True
        self.queue = queue
        self.rec_data_Instance=rec_data_Instance
        if self.rec_data_Instance:
            self.signal.connect(self.rec_data_Instance.rec_data)


    def __del__(self):
        self.running = False
        self.wait()

    def run(self):
        while self.running:
            # if self.udp_queue.
            if self.queue.empty()!= True :
                # print(self.queue.get())
                self.signal.emit(self.queue.get())

    def stop(self):
        self.running = False

'''ui 显示线程'''
class MY_Widget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.button_num = 0  
    def initUI(self):
        self.ip = "10.7.28.51"
        self.port = 9999
        ### 窗体大小
        self.height = 100
        self.width = 200
        self.resize(self.width,self.height)
        ### 设置窗体 标题
        self.setWindowTitle("UDP ")
        v1layout = QVBoxLayout()
        self.open_button = QPushButton("打开")
        self.open_button.clicked.connect(self.open_button_func)
        self.edit= QTextEdit(self)
        self.edit.setText("test")
        v1layout.addWidget(self.open_button)
        v1layout.addWidget(self.edit)
        self.setLayout(v1layout)
        self.show()

    def open_udp_server(self,ip,port):  
            ADDR = ip, port
            #接受队列
            self.udp_queue=Queue(maxsize=5)
            #udp 服务
            self.server = MyUDPServer(ADDR, Handler, self.udp_queue)  
            #创建线程,线程用于UDP接收
            self.server_thread = threading.Thread(target=self.server.serve_forever)  
            #设置后台线程
            self.server_thread.setDaemon(True) 
            self.server_thread.start()   
            #创建数据解析
            self.up_mythread = mythread(self.udp_queue,self)
            self.up_mythread.start()
    def close_udp_server(self):  
            self.up_mythread.stop()
            self.server.shutdown()
            self.server.server_close()
    def print_hex(self,bytes):
        l = [hex(int(i)) for i in bytes]
        str = " ".join(l)
        return str

    def rec_data(self,data):
        print(self.print_hex(data))
        self.edit.setText(self.print_hex(data))

    def open_button_func(self):
        self.button_num = self.button_num+1
        if self.button_num %2 == 1:
            self.open_button.setText("关闭")
            self.open_udp_server(self.ip,self.port)

        else:
            self.open_button.setText("打开")
            self.close_udp_server()



if __name__ == "__main__":  
    app = QApplication(sys.argv)
    #创建ui
    ex = MY_Widget()
    app.exit(app.exec_())
相关推荐
冷雨夜中漫步8 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴8 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再9 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手10 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
黎雁·泠崖11 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_7634724612 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威12 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos