博客
关于我
Python3组播通信编程实现教程(发送者+接收者)
阅读量:797 次
发布时间: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/Selenium - 无法单击 www.instagram.com 上的“接受 cookie“按钮
    查看>>
    Python内置函数(35)——next
    查看>>
    python写入mysql
    查看>>
    python写入csv老是乱码或者各种不好
    查看>>
    Python内置函数
    查看>>
    Python2 安装MySQLdb库
    查看>>
    Python2 已终结,入手Python 3,你需要这30个技巧
    查看>>
    python写下拉列表在excel,无法使用python获取Excel下拉列表(组合框)值
    查看>>
    python2.7安装
    查看>>
    Python2.7安装ncmbot时提示:Microsoft Visual C++9.0 is required
    查看>>
    PYTHON2.Git.1
    查看>>
    python20181211
    查看>>
    Python内存管理机制
    查看>>
    Python2中range 和xrange的区别??
    查看>>
    python2和3的区别
    查看>>
    python2和python3的pip版本升级
    查看>>
    python2和python3的区别
    查看>>
    python2备份交换机配置脚本
    查看>>
    Python3 - 在字符串格式化程序参数中使用变量
    查看>>
    Python3 A*寻路算法实现
    查看>>