Python封装一个接收UDP组播的模块

  • Python封装一个可以接收UDP组播的类MulticastDataReceiver,在子线程中接收组播数据
python 复制代码
# udp_multicast.py
import socket
import threading
import time


class MulticastDataReceiver:
    def __init__(self, multicast_group, multicast_port, dest_addr, dest_port):
        self.multicast_group = multicast_group
        self.multicast_port = multicast_port

        self.dest_addr = dest_addr
        self.dest_port = dest_port

        self.sock = None
        self.thread_recv = None
        self.thread_send = None
        self.running = False

    def start(self):
        # 创建UDP套接字
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 允许端口复用
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 绑定本机IP和组播端口
        self.sock.bind(('', self.multicast_port))
        # 设置UDP Socket的组播数据包的TTL(Time To Live)值
        self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
        # 声明套接字为组播类型
        self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)
        # 加入多播组
        self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
                             socket.inet_aton(self.multicast_group) + socket.inet_aton('0.0.0.0'))

        self.running = True
        self.thread_recv = threading.Thread(target=self._receive_data)
        self.thread_send = threading.Thread(target=self._send_data)
        self.thread_recv.start()
        self.thread_send.start()

    def stop(self):
        self.running = False
        if self.thread_recv:
            self.thread_recv.join()
        if self.thread_send:
            self.thread_send.join()
        if self.sock:
            self.sock.close()

    # 接收数据
    def _receive_data(self):
        while self.running:
            data, address = self.sock.recvfrom(1024)
            print(f"Received data from {address}: {data.decode()}")

    # 发送数据
    def _send_data(self):
        while self.running:
            data = "HLD"
            self.sock.sendto(data.encode(), (self.dest_addr, self.dest_port))
            # 休眠2秒
            time.sleep(2)
  • 在main函数中的调用示例
python 复制代码
# main.py
import time
import udp_multicast as UDPWorker

def main():
    # 组播地址和端口
    multicast_group = '224.0.0.1'
    multicast_port = 5020

    dest_addr = '127.0.0.1'
    dest_port = 19988

    receiver = UDPWorker.MulticastDataReceiver(multicast_group, multicast_port, dest_addr, dest_port)
    receiver.start()

    try:
        while True:
            time.sleep(2)
            pass
    except KeyboardInterrupt:
        receiver.stop()

if __name__ == "__main__":
    main()
  • 效果截图
相关推荐
Crossoads14 分钟前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
扎克begod19 分钟前
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
java·开发语言·python
code bean27 分钟前
【C#基础】函数传参大总结
服务器·开发语言·c#
阳光阿盖尔36 分钟前
EasyExcel的基本使用——Java导入Excel数据
java·开发语言·excel
蔚一38 分钟前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
Book_熬夜!39 分钟前
Python基础(九)——正则表达式
python·正则表达式·php
liang899944 分钟前
SpringSecurity原理解析(七):权限校验流程
java·开发语言
LQS202044 分钟前
基于Python实现一个浪漫烟花秀
开发语言·python
QXH2000001 小时前
数据结构—单链表
c语言·开发语言·数据结构
梅如你1 小时前
python批量对遥感影像进行归一化与数据清洗
开发语言·python