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

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。