Python UDP 简单数据传输

新建一个Python文件就可以使用了,我不是太喜欢弯弯绕绕的程序获取方法,主程序文件和测试程序都在下面,拿走直接用就行。

如果喜欢的话,在时间允许的情况下欢迎去我的Github主页点一波关注,谢谢!

UDP Service 主程序文件

# -*- coding: utf-8 -*-
"""
使用 Socket 处理 UDP 信息
用来处理普通的文本类信息
"""
import socket
import queue
import utils.logUtil


class UdpService_Multi:
    """多线程调用UDP服务时使用UdpService_Multi"""
    def __init__(self, host:str, port:int, queue = None, use_queue = False, bufsize=1024):
        '''
        多线程调用初始化
        :param host: 主机地址 都是接受者的地址
        :param port: 端口 都是接受者的地址端口
        :param queue: 多线程消息队列
        :param use_queue: 是否使用多线程消息队列
        :param bufsize: 消息大小,默认 1024
        '''
        # super(UdpService, self).__init__()
        self.host = host  # 主机地址 都是接受者的地址
        self.port = port  # 端口 都是接受者的地址端口
        self.queue = queue  # 多线程消息队列
        self.use_queue = use_queue  # 是否使用多线程消息队列
        self.bufsize = bufsize  # 消息大小,默认 1024

    def receiver_start(self) -> str or queue:
        """使用UDP协议接收数据,不保证数据是否全被接收!"""
        # 指定使用的协议
        receiver = socket.socket(type=socket.SOCK_DGRAM)
        receiver.bind((self.host,self.port))  # 接收程序的服务地址
        while True:
            # 接收消息
            data, addr = receiver.recvfrom(self.bufsize)  # 设置消息长度 int
            msg = data.decode('utf8')
            if self.use_queue:
                # 如果使用多线程消息队列传输消息
                if self.queue is None:
                    # 如果使用多线程消息队列但是并未将目标队列传入方法
                    # 抛出异常
                    utils.logUtil.LogSys.show_error("请设置多线程消息队列!!!")
                # 如果使用 多线程消息队列
                self.queue.put(msg)  # 消息队列放入接收到的信息
                # print(self.queue.get())
            else:
                # 如果不使用多线程消息队列
                return msg

    def send_start(self, msg_queue:queue) -> None:
        """使用UDP协议发送数据,不保证数据能全被送到"""
        # 指定使用的协议
        sender = socket.socket(type=socket.SOCK_DGRAM)
        receiver_addr = (self.host, self.port)  # 接收程序的地址
        while True:
            # 发送消息
            send_msg = msg_queue.get()  # 从消息队列拿数据
            msg = send_msg.strip()
            sender.sendto(msg.encode('utf8'), receiver_addr)


class SendNoLoop:
    """发送消息,但不使用多线程"""
    def __init__(self, host:str, port:int, queue = None, use_queue = False, bufsize=1024):
        # super(UdpService, self).__init__()
        self.host = host  # 主机地址 都是接受者的地址
        self.port = port  # 端口 都是接受者的地址端口
        self.queue = queue  # 多线程消息队列 用于
        self.use_queue = use_queue  # 是否使用多线程消息队列
        self.bufsize = bufsize  # 消息大小,默认 1024
        # 指定使用的协议
        sender = socket.socket(type=socket.SOCK_DGRAM)
        receiver_addr = (self.host, self.port)  # 接收程序的地址
        self.sender = sender
        self.receiver_addr = receiver_addr

    def send_start(self, msg:str) -> None:
        """使用UDP协议发送数据,不保证数据能全被送到"""
        self.sender.sendto(msg.encode('utf8'), self.receiver_addr)

接收端测试程序

# -*- coding: utf-8 -*-
import service.udp.udpService as udpService
import utils.threadUtil as threadUtil
import queue


def main():
    host = "localhost"  # 设置 host 地址
    port = 12237  # 设置端口号
    msg_queue = queue.Queue()  # 设置消息队列
    service = udpService.UdpService_Multi(host=host,port=port,queue=msg_queue,use_queue=True)  # 初始化
    threadUtil.MyThread("UDP Server",service.receiver_start)  # 以子线程启动 UDP 接收服务
    print("12")
    while True:
        msg = msg_queue.get()  # 从消息队列读取信息
        print("main",msg)
    threadUtil.MyThread.join()  # join


if __name__ == '__main__':
    main()

发送端测试程序

# -*- coding: utf-8 -*-
import service.udp.udpService as udpService
import queue

if __name__ == '__main__':
    host = "localhost"  # 设置 host 地址
    port = 12237  # 设置端口号
    udp_service = udpService.SendNoLoop(host=host,port=port)  # UDP 服务初始化
    udp_service.send_start("Hello")  # 发送消息

猜你喜欢

转载自blog.csdn.net/qq_17790209/article/details/129339835