Python使用socket实现组播与发送二进制数据

 更新时间:2021年06月16日 15:54:05   作者:一天一篇Python库  
在工作中经常会用到socket传输数据,例如客户端给服务器发送数据(双方约定了数据格式),本文主要介绍了Python使用socket实现组播与发送二进制数据,感兴趣的可以了解一下

什么是组播

点对点连接可以处理很多通信需求,不过随着直接连接数的增加,在多对通信方之间传递相同的消息会变得越来越困难。

单独地向各个接收方发送消息会耗费额外的处理时间和带宽,这对于诸如完成流视频或音频操作的应用来说,代码会出现显著的性能问题。

而使用组播(multicast)向多个端点同时发送消息可以得到更好的效率,因为网络基础设施可以确保数据包会被传送到所有接收方。

组播消息总是使用UDP发送,因为TCP需要提供一对通信系统。组播的地址被称为组播组,这是常规的IPv4地址范围的一个子集(224.0.0.0~230.255.255.255),专门为主播通信预留。

这些地址会由网络路由器和交换机进行特殊的处理,所以发送到组的消息可以在互联网上被分发到加入这个组的所有接收方。

需要注意的是,大多数托管的路由器与交换机默认会禁止组播通信。如果后续运行程序有问题,那么可以检查你的网络设置。

发送组播消息

由于无法知道会收到多少响应,所以需要对套接字使用一个超时值,以避免等待回答时无限阻塞。

TTL(Time-To-Live value)是一个生存时间值,会控制多少网络接收这个数据包。要使用IP_MULTICAST_TTL选项与setsockopt()函数来设置TTL。默认值1表示路由器不会把数据包转发到当前网段之外。TTL最大取值255,应包包装为1个字节。

示例代码如下:

import socket
import struct

# 1.创建一个套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

multicast_group = ('224.3.29.71', 10000)
sock.settimeout(10)

ttl = struct.pack('b', 1)#本博主数据结构与算法第10篇对struct二进制结构体进行介绍
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)

try:
    msg = "群发的消息,你不必回".encode('UTF-8')
    sent = sock.sendto(msg, multicast_group)
    while True:
        try:
            data, server = sock.recvfrom(1024)
        except socket.timeout:
            print('time out')
            break
        else:
            print(data, server)
finally:
    sock.close()

这里的代码与UDP类似,除了sock.setsockopt()的调用。

接收组播消息

建立组播接收者的第一步是创建UDP套接字。创建常规的套接字并绑定到一个端口后,可以使用setsockopt()改变IP_ADD_MEMBERSHIP选项,增加安东组播组。

这个选项值是组播地址的一个8字节的打包表示,后面是服务器监听通信流的网络接口,由其IP地址标识。这里,接收者使用INADDR_ANY监听所有接口。

示例代码如下:

import socket
import struct

multicast_group = '224.3.29.71'
server_address = ('', 10000)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)

group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
    data, address = sock.recvfrom(1024)
    print(data.decode('UTF-8'), address)
    sock.sendto('组播消息已经收到'.encode('UTF-8'), address)

接收者的循环与UDP服务器类似。

运行之后,效果如下:

接收者

发送者

到此这篇关于Python使用socket实现组播与发送二进制数据的文章就介绍到这了,更多相关Python 组播与发送二进制数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python虚拟环境与依赖管理使用方法全指南

    Python虚拟环境与依赖管理使用方法全指南

    这篇文章主要介绍了如何使用虚拟环境和pip来管理Python项目的依赖和包版本,虚拟环境可以帮助隔离不同项目的依赖,避免版本冲突,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • python去除拼音声调字母,替换为字母的方法

    python去除拼音声调字母,替换为字母的方法

    今天小编就为大家分享一篇python去除拼音声调字母,替换为字母的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • pandas将Series转成DataFrame的实现

    pandas将Series转成DataFrame的实现

    本文主要介绍了pandas将Series转成DataFrame的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 插入排序_Python与PHP的实现版(推荐)

    插入排序_Python与PHP的实现版(推荐)

    下面小编就为大家带来一篇插入排序_Python与PHP的实现版(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • python处理json字符串(使用json.loads而不是eval())

    python处理json字符串(使用json.loads而不是eval())

    eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,本文就详细介绍一下
    2021-09-09
  • Python获取百度热搜的完整代码

    Python获取百度热搜的完整代码

    这篇文章主要介绍了Python获取百度热搜的完整代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Pytorch中index_select() 函数的实现理解

    Pytorch中index_select() 函数的实现理解

    这篇文章主要介绍了Pytorch中index_select() 函数的实现理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 用Python实现数据的透视表的方法

    用Python实现数据的透视表的方法

    今天小编就为大家分享一篇用Python实现数据的透视表的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python之is与==的区别详解

    Python之is与==的区别详解

    这篇文章主要介绍了Python之is与==的区别详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 使用Python的数据可视化库Matplotlib实现折线图

    使用Python的数据可视化库Matplotlib实现折线图

    数据可视化是数据分析和探索中不可或缺的一环,本文将介绍如何使用Python中的数据可视化库Matplotlib,通过示例代码实现一个简单的折线图,感兴趣的同学可以参考阅读下
    2023-07-07

最新评论