博客
关于我
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--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>
    Python写表情包搜索工具(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Python-【1】配置
    查看>>