目录
一.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.接收端文章来源:https://www.toymoban.com/news/detail-558191.html
接收消息并处理消息文章来源地址https://www.toymoban.com/news/detail-558191.html
# 导入模块
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()
到了这里,关于【全民Python】 Python网络通信UDP消息收发处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!