Python使用socket实现组播与发送二进制数据
作者:一天一篇Python库 发布时间:2021-05-09 13:44:28
什么是组播
点对点连接可以处理很多通信需求,不过随着直接连接数的增加,在多对通信方之间传递相同的消息会变得越来越困难。
单独地向各个接收方发送消息会耗费额外的处理时间和带宽,这对于诸如完成流视频或音频操作的应用来说,代码会出现显著的性能问题。
而使用组播(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服务器类似。
运行之后,效果如下:
来源:https://liyuanjinglyj.blog.csdn.net/article/details/117414372
猜你喜欢
- Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果
- 新建图像文件后选Channels面板,新建Alpha1通道; 做压
- 如题,在控制台运行python manage.py startapp sales 建立一个应用报错异常1.应用名不能包含下划线等字符 所以a
- 在Asp中如何得到所有表单的名称跟对应的值。其实,这个问题很简单,但是可能还是有很多人不知道该怎么做,所以特地写下来,仅供参考。在Asp程序
- 数据库技术是计算机科学中发展最快的领域之一,数据库的诞生和发展给计算机信息管理带来了一场巨大的革命。数据库的诞生和发展给计算机信息管理带来了
- 步骤一:下载对应的CURL压缩包并在windows上配置好环境变量进入CURL官网下载对应的windows压缩包。地址:点击打开链接把下载好
- 若对于同一数据库实例中的两个数据库进行同步则直接对数据库表创建Trigger。SQL Server 2005的联机帮助:Trigger on
- 环境:RHEL 5.4 x86 , oracle 11.2 1.设定环境变量 在/home/oracle编辑 # .bash_profile
- 最简单的方法:取整后判断是否和原值相等!javascript的取整函数是:parseIntif(parseInt(value)==value
- 在js中调用asp文件的方法很简单,我们可以用在静态页面的点击数统计,虽然静态页面不支持asp程序,但是我们可以使用js调用,来变相的达到这
- 为什么很多站长开始做英文网站,我想主要是原因是良好的互联网环境让大家更容易赚到钱,中小站长做英文网站大致为两类,一是电子商务的外贸网站,二是
- 为了防止采集,我试过各种方法,绝大多数方法是“ * 剑”---防止了采集,也影响了搜索引擎收录,实在不爽!一天本人忽发奇想:何不
- Python的五个标准数据类型数字字符串列表元组字典一、数字不可变数据类型,存储值为数值1.创建对象,分配数值例:>>>
- 在IE浏览器调试代码,我们可以选择使用 IE WebDeveloper但是我个人用惯了ff浏览器下的firebug,所以在网上搜了一下,如果
- 对网站的LOGO设计做了一些归纳,希望得到批评,发现写的太长了,又不忍心删减,就分成两部分了,第一部分是有关设计基础的。第二部分是关于网站L
- 今天在看框架的时候无意间看到了document.compatMode,经过一番资料查找,终于搞懂了。文档模式在开发中貌似很少用到,最常见的是
- 我从11岁开始编程,并且一直都很喜欢技术和编程。这些是我一直以来获得的经验教训。作为一个程序员,你可能需要这样的忠告。我更希望每个人在获取这
- 有2个不同的方法增加用户:通过使用GRANT语句或通过直接操作MySQL授权表。比较好的方法是使用GRANT语句,因为他们是更简明并且好像错
- 本文实例讲述了Python运维自动化之nginx配置文件对比操作。分享给大家供大家参考,具体如下:文件差异对比diff.py#!/usr/b
- XMLHttpRequest的兼容代码功能结构上大体没有什么变动主要处理了这么几条:1.不同浏览器的创建方式2.事件大小写问题(ie7的XM