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

news/2024/5/18 12:07:48 标签: 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()
  • 效果截图
    在这里插入图片描述

http://www.niftyadmin.cn/n/5033114.html

相关文章

Python 列表的常用方法

视频版教程 Python3零基础7天入门实战视频教程 列表list对象提供了很多内置方法供我们操作list。我们要掌握常用的list方法。(具体类和对象,方法我们下一个章节详细讲解) 1,修改指定位置的元素值 语法:列表[下标索引]值 list1 ["jav…

【LEAP模型】能源需求、碳排放建模预测、不确定性分析

采用部门分析法建立的LEAP(Long Range Energy Alternatives Planning System/ Low emission analysis platform,长期能源可替代规划模型)是一种自下而上的能源-环境核算工具,由斯德哥尔摩环境研究所和美国波士顿大学联合研发。该模…

医疗领域超低温监控,你了解吗?

超低温冰箱在医疗保健领域中扮演着不可或缺的角色。它们被广泛用于存储生物样本、药物和疫苗等温度敏感的医疗物品,以确保这些关键资源的质量和有效性。 然而,温度波动和不稳定性可能会对这些物品造成严重损害,甚至威胁患者的生命。为了应对这…

C++基础-类和对象(下)

文章目录 前言一、构造深入1.初始化列表2.隐式类型转换1.隐式类型转换2.explicit 3.委托构造 二、类的静态成员1.静态成员声明2.静态成员定义3.静态成员特性 三、重载运算符和类型转化1.关系及算数运算符重载2.递增递减运算符重载及如何区分3.赋值运算符重载4.重载输入输出运算…

Xilinx ZYNQ 7000学习笔记四(MultiBoot多重启动)

概述 在前面《Xilinx ZYNQ 7000学习笔记一(复位和启动)》一节中,简单介绍了BootRom的运行流程和什么是persistent registers (持续寄存器),在本节将对ZYNQ7000 MultiBoot多重启动实现进行讲解。 MultiBoot多重启动实现是基于ZYNQ…

物联网 低功耗蓝牙BLE GATT 实现微信小程序通信连接详细教程

蓝牙基本概念 蓝牙技术是一种无线通信的方式,利用特定频率的波段(2.4GHz ~ 2.485GHz左右),进行电磁波传输。蓝牙传输原理是主从关系,一个主设备可以与7个蓝牙从设备配对。 经典蓝牙 vs BLE 蓝牙分为经典蓝牙和低功耗…

C++ 动态库与静态库的区别?

一、生成方式 静态库生成 g -c add.cc -o add.o g -c del.cc -o del.o ar rcs libapi.a del.o add.o g -static main.cc -o static main -L./ -lapi -l./ ./static main动态库生成 g -c add.cc -o add.o g -c del.cc -o del.o g -shared -fPIC -o libapi.so del.o add.o g m…

Python 之利用matplotlib.pyplot 生成图形和图表

文章目录 介绍运用 介绍 matplotlib.pyplot是Matplotlib库的一个子模块,它提供了一个简单的界面来创建各种类型的图形和图表。使用pyplot,您可以轻松创建、定制和显示图形,而无需编写大量的底层代码。以下是matplotlib.pyplot的一些常见用法…