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")  # 发送消息
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Python UDP实时传输语音数据,你需要按照以下步骤: 1. 首先,你需要使用Python的PyAudio库来录制语音数据。你可以使用PyAudio库中的`pyaudio.PyAudio()`类来初始化音频流,使用`stream.read()`方法来读取音频数据并将其存储在缓冲区中。 2. 然后,你需要将录制的语音数据转换为二进制格式。你可以使用Python的struct模块来实现这一点。使用`struct.pack()`方法将数据打包成二进制格式。 3. 接下来,你需要将二进制数据通过UDP协议传输到接收方。你可以使用Python的socket模块来创建UDP套接字,并使用`socket.sendto()`方法发送数据包。你需要指定接收方的IP地址和端口号。 4. 最后,接收方可以使用类似的方法将接收到的二进制数据转换回音频数据,并使用PyAudio库将其播放出来。 以下是一个基本的示例代码,用于实时传输语音数据: ```python import pyaudio import socket import struct # 初始化音频流 p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024) # 创建UDP套接字 UDP_IP = "127.0.0.1" UDP_PORT = 5005 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 循环录制和发送数据 while True: # 读取录音数据 data = stream.read(1024) # 将数据打包成二进制格式 packed_data = struct.pack('h'*1024, *data) # 发送数据包 sock.sendto(packed_data, (UDP_IP, UDP_PORT)) ``` 请注意,这只是一个基本的示例代码,你需要根据自己的需求进行修改和完善。在实际应用中,你还需要考虑数据压缩、丢包重传等一系列问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值