【全民Python】 Python网络通信UDP消息收发处理

目录

一.UDP介绍

二.UDP的使用方法

三.源码


一.UDP介绍

1. UDP的英文单词是User Datagram Protocol,缩写为UDP,是一种用户数据报协议,又称为用户数据报文协议,是一种报文的协议,是一个简单的面向数据报的传输层协议  。
2.UDP的发起和接受是不需要经过连接的,仅仅只需要发送在对应端口上进行监听接受即可,不需要两个客户端一定要建立连接才能进行通信 。
3.UDP的优点是速度快、开销小、实时性好,但是缺点是不可靠、容易丢包、无序到达。
4.UDP适用于对网络通讯质量要求不高的场景,比如QQ音视频传输、微信音视频传输等。
5.UDP是一种无连接的传输层协议,它可以实现简单的网络通讯,不需要建立连接就可以发送和接收数据。Python提供了socket模块来支持UDP通讯,可以使用socket.socket()函数创建一个UDP套接字对象,然后调用sendto()方法发送数据,调用recvfrom()方法接收数据

二.UDP的使用方法

1. 通过socket对象可以实现UDP通信的发送和接收功能。发送数据使用sendto()方法,接收数据使用recvfrom()方法 。
2.sendto()方法需要两个参数:要发送的数据(bytes类型)和目标地址(IP地址和端口号组成的元组) 。例如:sock.sendto(b'Hello', ('127.0.0.1', 8888))
3. recvfrom()方法需要一个参数:指定接收数据的最大字节数(int类型),返回值是一个元组:接收到的数据(bytes类型)和发送方地址(IP地址和端口号组成的元组) 。例如:data, addr = sock.recvfrom(1024)

三.源码

1.udp发送端

print("---------------------------------udp发送端------------------------------")

# 创建一个UDP套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 定义目标主机和端口
host = "127.0.0.1"
port = 8888

# 发送消息
message = "Hello, UDP!"
udp_socket.sendto(message.encode(), (host, port))
print('发送消息:', message)
# 接收消息
data, addr = udp_socket.recvfrom(1024)
print("Received from %s: %s" % (addr, data.decode()))

# 关闭套接字
udp_socket.close()

2.接收端

接收消息并处理消息

# 导入模块
import socket
import threading
import queue
print("---------------------------------udp监听端------------------------------")
# 定义消息队列,用于存储生产者发送的数据和消费者接收的数据
msg_queue = queue.Queue()

# 定义生产者类,继承自threading.Thread
class Producer(threading.Thread):
    def __init__(self, name, host, port):
        # 调用父类的初始化方法
        super().__init__()
        # 设置线程名字
        self.name = name
        # 创建udp套接字对象
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 绑定主机和端口号
        self.sock.bind((host, port))

    def run(self):
        # 线程运行的方法,循环接收数据并放入消息队列中
        while True:
            # 接收数据,返回一个元组(data, address)
            data, address = self.sock.recvfrom(1024)
            # 将数据和地址封装成一个元组,放入消息队列中
            msg_queue.put((data.decode(), address))
            # 打印提示信息,显示生产者线程名字,发送方地址和数据内容
            print(f"{self.name} 接收 data from {address}: {data.decode()}")

# 定义消费者类,继承自threading.Thread


class Consumer(threading.Thread):
    def __init__(self, name):
        # 调用父类的初始化方法
        super().__init__()
        # 设置线程名字
        self.name = name

    def run(self):
        # 线程运行的方法,循环从消息队列中取出数据并处理
        while True:
            # 从消息队列中取出一个元素,返回一个元组(data, address)
            data, address = msg_queue.get()
            # 处理数据,这里简单地将数据转换成大写形式,并打印提示信息,显示消费者线程名字,接收方地址和处理后的数据内容
            data = data.upper()
            print(f"{self.name} 处理 data for {address}: {data}")


# 创建一个生产者对象,并设置线程名字为P1,监听本地主机的8888端口
p1 = Producer("P1", "localhost", 8888)
# 启动生产者线程
p1.start()

# 创建两个消费者对象,并设置线程名字为C1和C2
c1 = Consumer("C1")
c2 = Consumer("C2")
# 启动消费者线程
c1.start()
c2.start()

猜你喜欢

转载自blog.csdn.net/qq_37310110/article/details/129612914