博客
关于我
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卸载所有包
    查看>>
    python单线程下实现多个socket并发
    查看>>
    Python单元测试框架介绍(超详细~)
    查看>>
    Python单元测试框架
    查看>>
    python单元测试之unittest
    查看>>
    Python单元测试unittest实战
    查看>>
    Python单元测试-模拟VS补丁
    查看>>
    python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
    查看>>
    Python十进制&;包提供错误的结果
    查看>>
    Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
    查看>>
    Python加速运行技巧
    查看>>
    python办公自动化基础遍历文件夹
    查看>>
    python办公自动化基础输出文件和文件夹
    查看>>
    python办公自动化基础搜索文件
    查看>>
    python知识:@classmethod和@staticmethod的异同
    查看>>
    python前端之css
    查看>>
    Python制作进度条,原来有这么多方法
    查看>>
    Python制作简单的学生成绩管理系统
    查看>>
    python制作甘特图的基本知识(附Demo)
    查看>>
    python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
    查看>>