首页 > 编程语言 >Python+UDP+Threading

Python+UDP+Threading

时间:2023-04-29 22:58:07浏览次数:46  
标签:__ UDP socket Python self udp Threading recv

Python+UDP+Threading

近期用python socket使用TCP协议做了一个小型的数据收发服务器,后来由于在实际场景中使用时,出现网络不佳导致出现错误的情况,改成了使用UDP协议重做了一版,总体效果变好了。下面是通用代码,实际使用时在这基础上进行修改即可。

# -*- coding: utf-8 -*-
import json
import socket
import queue
import struct
import threading
from concurrent.futures import ThreadPoolExecutor

UDP_HOST = '0.0.0.0'
UDP_PORT = 11400
BUFSIZE = 1024
UDP_ADDR = (UDP_HOST, UDP_PORT)

class RecvMsg(threading.Thread):
    def __init__(self, udp_socket: socket.socket, q):
        threading.Thread.__init__(self)
        self.udp_socket = udp_socket
        self.q = q

    def run(self) -> None:
        while True:
            recv_data, addr = self.udp_socket.recvfrom(BUFSIZE)
            recv_data = recv_data.decode('utf-8')
            print(f"收到数据{recv_data}")
            if recv_data == '':
                continue
            self.q.put(msg_list)	# 存放在消息队列


class SendMsg(threading.Thread):

    def __init__(self, udp_socket: socket.socket, q: queue):
        threading.Thread.__init__(self)
        self.udp_socket = udp_socket
        self.q = q

    def run(self) -> None:
        while True:
            if not self.q.empty():
                msg = self.q.get()	# 从消息队列中取出
                print(f"发送数据{msg}")
                self.udp_socket.sendto(msg.encode("utf-8"), client_aad)# client_addr是目标客户端地址 tuple

def main():
    
    q = queue.Queue()	# 消息队列
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(UDP_ADDR)

    t_recv = RecvMsg(udp_socket, q)	# 负责收数据的线程
    t_send = SendMsg(udp_socket, q)	# 负责转发数据的线程

    t_recv.start()
    t_send.start()
    
    print("==" * 20 + "服务启动" + "==" * 20)
	print("==" * 20 + "等待连接" + "==" * 20)

if __name__ == "__main__":
    main()

标签:__,UDP,socket,Python,self,udp,Threading,recv
From: https://www.cnblogs.com/cnpolaris/p/17364594.html

相关文章

  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • Python打印一个字典,输出带双引号
    Python中dict(字典)默认的表示方式是用单引号表示键和值,例如:my_dict={'key1':'value1','key2':'value2'}print(my_dict)这将输出:{'key1':'value1','key2':'value2'}如果你想使用双引号代替单引号进行表示,可以使用json模块来实现。......
  • Python MatplotlibDeprecationWarning Matplotlib 3.6 and will be removed two minor
    百度飞桨(PaddlePaddle)-数字识别在Pycharm中使用Matplotlib中的pyplot时,运行代码报错:MatplotlibDeprecationWarning:SupportforFigureCanvaseswithoutarequired_interactive_frameworkattributewasdeprecatedinMatplotlib3.6andwillberemovedtwominorreleases......
  • Python: PostgreSQL
     connectionimportpsycopg2frompsycopg2importError,connection,cursorconn:connection|None=Nonec1:cursor|None=Nonetry:conn=psycopg2.connect(host='localhost',port=5432,user='postgres',......
  • linux c/c++程序集成python库,实现调用python函数
    为了提高开发效率,扩展开发程序的功能,我们经常会在我们的linuxc/c++进程里调用外部脚本,例如lua、python,下面,介绍下如何在自己的linuxc/c++代码里调用python脚本里的函数和类,并且将python库集成到我们自己的进程目录里,这样就不依赖系统环境是否存在python及其版本要求。 ......
  • python+playwright 学习-59 grant_permissions 设置默认允许麦克风和摄像头等权限
    前言有些场景在使用的时候,会弹出一些权限框,比如麦克风和摄像头等,通过监听alert是没法捕获的。正确做法是给浏览器设置默认允许麦克风和摄像头等权限,不让弹窗出来。使用context的grant_permissions方法加权限。权限框弹窗示例这种弹窗是权限窗,不是alert解决办法context有个gr......
  • python+playwright 学习-58 Jenkins上使用 Pipeline 运行 playwright 自动化脚本
    前言Dockerfile.focal可用于在Docker环境中运行Playwright脚本。这些镜像包括在Docker容器中运行浏览器所需的所有依赖项,还包括浏览器本身。playwright在linux系统上目前只支持Ubuntu系统的部分版本,centos和debian系统上是没法运行的。jenkins环境准备需安装2个跟docke......
  • python+playwright 学习-57 svg 元素拖拽
    前言SVG英文全称为ScalablevectorGraphics,意思为可缩放的矢量图,这种元素比较特殊,需要通过name()函数来进行定位。本篇讲下关于svg元素的拖拽相关操作。拖拽svg元素如图所示,svg下的circle元素是可以拖动的比如往右拖动100个像素,那么cx的值由原来的cx="100"变成cx="200"通......
  • python+playwright 学习-56 svg 元素定位
    前言SVG英文全称为ScalablevectorGraphics,意思为可缩放的矢量图,这种元素比较特殊,需要通过name()函数来进行定位。svg元素定位如下看到的svg标签,就是svg元素用普通的标签定位,是无法定位的,如xpath的//svg只能通过name()函数来定位//*[name()="svg"]页面上用多个svg元素如果......
  • python+playwright 学习-55 在docker 容器中运行playwright脚本
    前言Dockerfile.focal可用于在Docker环境中运行Playwright脚本。这些镜像包括在Docker容器中运行浏览器所需的所有依赖项,还包括浏览器本身。playwright在linux系统上目前只支持Ubuntu系统的部分版本,centos和debian系统上是没法运行的。镜像查看所有可用的图像标签https:......