博客
关于我
Python3组播通信编程实现教程(发送者+接收者)
阅读量:800 次
发布时间:2023-03-08

本文共 2082 字,大约阅读时间需要 6 分钟。

一、组播技术说明

  • 标准组播解释
    通信分为单播、多播(即组播)和广播三种方式。
    • 单播:发送者发送数据包后,路由器将其发往目标IP地址唯一指定的设备。例如,用户与Web服务器通信属于单播形式。
    • 广播:发送者发送数据包后,路由器将其发给与其直接连接的所有设备。
    • 组播:发送者发送数据包后,路由器将其发往目标IP地址对应的组播组名下的所有主机。
    1. 个人对组播的理解

      标准解释相对清晰,但在实际应用中存在许多问题。例如,组播地址是否直接对应物理设备?在组播数据包被发送后,如何决定目标主机?这些问题需要结合实际测试和深入理解网络协议来解答。

    2. 组播技术的工作原理

      从底层技术来看,组播数据包与普通UDP数据包的区别仅在于其目的IP地址为组播保留IP。具体流程如下:

      • 发送主机:网卡识别到目的IP为组播保留IP后,会将目的MAC地址改为组播MAC地址,随后向所有网络接口发送数据包。
      • 交换机:接收到组播数据包后,交换机通过目的MAC地址识别这是组播数据包,会将源MAC地址改为自身MAC地址,并保持目的MAC地址不变,向所有端口发送数据包。
      • 路由器:路由器通过目的MAC地址或IP地址识别数据包为组播包。它会将源MAC地址改为自身MAC地址,保持目的MAC地址不变,同时保持源IP地址和目的IP地址不变。路由器会根据组播组地址表,将数据包发送至与目的IP地址匹配的端口。
      • 接收主机:接收方需要通过setsockopt加入组播组,启动对应端口的UDP监听进程才能接收到组播数据包。
      1. 组播通信示例
        发送者向组播地址发送数据包,接收方通过加入组播组并启动监听端口即可接收到数据包。例如:
        • 发送者S发送UDP数据包至组播地址234.2.2.2:23456。
        • 接收者R1和R2通过setsockopt加入组播组234.2.2.2,并启动对应端口23456的UDP监听。
        • R1和R2都能接收到发送者的数据包。

        二、组播程序实现

      2. 发送者代码
      3. import timeimport socketmcast_group_ip = '234.2.2.2'mcast_group_port = 23456def sender():    send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)    while True:        message = "this message send via mcast !"        send_sock.sendto(message.encode(), (mcast_group_ip, mcast_group_port))        print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}: message send finish")        time.sleep(10)if __name__ == "__main__":    sender()
        1. 接收者代码
        2. import structimport timeimport socketmcast_group_ip = '234.2.2.2'mcast_group_port = 23456def receiver():    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)    local_ip = socket.gethostbyname(socket.gethostname())    sock.bind((local_ip, mcast_group_port))    mreq = struct.pack("=4sl", socket.inet_aton(mcast_group_ip), socket.INADDR_ANY)    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)        while True:        try:            message, addr = sock.recvfrom(1024)            print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}: Receive data from {addr}: {message.decode()}")        except:            print("while receive message error occur")if __name__ == "__main__":    receiver()

          这段代码实现了一个简单的组播通信系统。发送者定期发送组播数据包,接收者通过加入组播组并监听特定端口接收数据包。

    转载地址:http://wblfk.baihongyu.com/

    你可能感兴趣的文章
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    python+requests+unittest执行自动化接口测试!
    查看>>
    Python+Requests编码识别Bug
    查看>>
    python函数编写_[零基础学python]传说中的函数编写条规
    查看>>
    Python+selenium —— UI自动化之鼠标操作
    查看>>
    python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
    查看>>
    Python+Selenium+Threading进行兼容性测试
    查看>>
    Python+selenium+unittest的GUI自动化框架实现
    查看>>
    python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
    查看>>
    python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
    查看>>
    Python+Selenium之数据驱动测试的实现
    查看>>
    python函数定义与使用+返回值简解
    查看>>
    Python+Selenium登录
    查看>>
    Python日期时间模块
    查看>>
    Python函数合集:足足68个内置函数请收好!
    查看>>
    Python+Selenium自动化测试项目实战
    查看>>
    Python+Selenium自动化测试项目实战【建议收藏】
    查看>>
    Python+Selenium自动化测试:Page Object模式
    查看>>
    python+selenium进行cnblog的自动化登录测试
    查看>>
    Python函数只返回第一个值而不是数据框
    查看>>