当前位置:   article > 正文

【全民Python】 Python网络通信UDP消息收发处理_python udp 实现组播数据的发送和接收

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发送端

  1. print("---------------------------------udp发送端------------------------------")
  2. # 创建一个UDP套接字对象
  3. udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4. # 定义目标主机和端口
  5. host = "127.0.0.1"
  6. port = 8888
  7. # 发送消息
  8. message = "Hello, UDP!"
  9. udp_socket.sendto(message.encode(), (host, port))
  10. print('发送消息:', message)
  11. # 接收消息
  12. data, addr = udp_socket.recvfrom(1024)
  13. print("Received from %s: %s" % (addr, data.decode()))
  14. # 关闭套接字
  15. udp_socket.close()

2.接收端

接收消息并处理消息

  1. # 导入模块
  2. import socket
  3. import threading
  4. import queue
  5. print("---------------------------------udp监听端------------------------------")
  6. # 定义消息队列,用于存储生产者发送的数据和消费者接收的数据
  7. msg_queue = queue.Queue()
  8. # 定义生产者类,继承自threading.Thread
  9. class Producer(threading.Thread):
  10. def __init__(self, name, host, port):
  11. # 调用父类的初始化方法
  12. super().__init__()
  13. # 设置线程名字
  14. self.name = name
  15. # 创建udp套接字对象
  16. self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  17. # 绑定主机和端口号
  18. self.sock.bind((host, port))
  19. def run(self):
  20. # 线程运行的方法,循环接收数据并放入消息队列中
  21. while True:
  22. # 接收数据,返回一个元组(data, address)
  23. data, address = self.sock.recvfrom(1024)
  24. # 将数据和地址封装成一个元组,放入消息队列中
  25. msg_queue.put((data.decode(), address))
  26. # 打印提示信息,显示生产者线程名字,发送方地址和数据内容
  27. print(f"{self.name} 接收 data from {address}: {data.decode()}")
  28. # 定义消费者类,继承自threading.Thread
  29. class Consumer(threading.Thread):
  30. def __init__(self, name):
  31. # 调用父类的初始化方法
  32. super().__init__()
  33. # 设置线程名字
  34. self.name = name
  35. def run(self):
  36. # 线程运行的方法,循环从消息队列中取出数据并处理
  37. while True:
  38. # 从消息队列中取出一个元素,返回一个元组(data, address)
  39. data, address = msg_queue.get()
  40. # 处理数据,这里简单地将数据转换成大写形式,并打印提示信息,显示消费者线程名字,接收方地址和处理后的数据内容
  41. data = data.upper()
  42. print(f"{self.name} 处理 data for {address}: {data}")
  43. # 创建一个生产者对象,并设置线程名字为P1,监听本地主机的8888端口
  44. p1 = Producer("P1", "localhost", 8888)
  45. # 启动生产者线程
  46. p1.start()
  47. # 创建两个消费者对象,并设置线程名字为C1和C2
  48. c1 = Consumer("C1")
  49. c2 = Consumer("C2")
  50. # 启动消费者线程
  51. c1.start()
  52. c2.start()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/791313
推荐阅读
相关标签
  

闽ICP备14008679号