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 组播与发送二进制数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3通过udp实现组播数据的发送和接收操作

    本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简单.由于摄像头内置了udp协议的server端程序,本文主要使用python模拟客户端发送udp数据包. 客户端代码 import socket import re ANY = "0.0.0.0" DES_IP = "239.255.255.250" PORT = 37

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

    什么是组播 点对点连接可以处理很多通信需求,不过随着直接连接数的增加,在多对通信方之间传递相同的消息会变得越来越困难. 单独地向各个接收方发送消息会耗费额外的处理时间和带宽,这对于诸如完成流视频或音频操作的应用来说,代码会出现显著的性能问题. 而使用组播(multicast)向多个端点同时发送消息可以得到更好的效率,因为网络基础设施可以确保数据包会被传送到所有接收方. 组播消息总是使用UDP发送,因为TCP需要提供一对通信系统.组播的地址被称为组播组,这是常规的IPv4地址范围的一个子集(224

  • python实现在内存中读写str和二进制数据代码

    我就废话不多说了,还是直接看代码吧! # 利用python在内存中读写str和二进制数据 from io import StringIO from io import BytesIO f = StringIO() print(f.write('hello ')) # 6 print(f.write('world!')) # 6 print(f.getvalue()) # hello world! f = BytesIO() print(f.write('中文'.encode('utf-8')))

  • 组播的相关概念

    D类地址是用于组播,也就是以1110开头,剩下28位用于鉴别组播地址(剩下的这28是个无结构的地址), 以01005e开头的MAC地址用于表示MAC的组播地址,剩下的23位用于标识组播,IP组播地址对于MAC地址有一个映射关系,也就是IP组播的后23对应Mac组播的后23位,这样就有可能出现多个IP对应一个MAC的现象,它们之间用Arp来解析. 如果一个局域网使用组播,那么所有的主机必须加入一个all-host组(组播地址为224.0.0.1),但是Host可以决定是否去接受组播.当一个组播交通

  • python使用socket向客户端发送数据的方法

    本文实例讲述了python使用socket向客户端发送数据的方法.分享给大家供大家参考.具体如下: import socket, sys port = 55555 host = 'localhost' data = "test" * 10485760 # 40MB of data s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) byteswritten = 0 while byt

  • 利用python的socket发送http(s)请求方法示例

    前言 这是个在写计算机网络课设的时候碰到的问题,卡了我一天,所以总结一下. 其实在之前就有用requests写过python爬虫,但是计算机网络要求更底层的实现,刚好我看到了[这篇文章]1结果发现他就是用socket来实现的请求,所以就学习了. 本来也觉得应该不难,毕竟就是建立tcp连接. 原网站的例子如下: def fetch(url): sock = socket.socket() # 建立socket sock.connect(('xkcd.com', 80)) # 远程连接 reques

  • Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之UDP发送接收数据功能.分享给大家供大家参考,具体如下: demo.py(UDP发送数据): import socket # 导入socket模块 def main(): # 创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机ip和端口号 (发送数据时,如果不绑定,系统会随机分配端口号.接收数据时,一般需要手动绑定ip和端口) udp_socket.b

  • python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = r'D:\Python\python_learning\gd\code\part3\02网络编程\文件传输\client\download' gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) gd_client.connect((

  • python使用socket高效传输视频数据帧(连续发送图片)

    目录 遇到的问题 代码问题记录(需要代码的可以直接文末) 代码 客户端clien.py 服务端server.py 遇到的问题 网上找了一些代码,都是只能建立一次socket传输一张图片,然后断开重新连重新传.而建立一次socket代价不小,反复建立会非常消耗系统资源,因此尝试自己通过一次socket连续传输多张图片 代码问题记录(需要代码的可以直接文末) 在做的过程中发现了一些问题: socket在传一张图片时是以二进制流的形式传输,图片的二进制流比较大,一般一次传不完,要传很多次.那么接受者是

  • nodejs dgram模块广播+组播的实现示例

    本机IP地址是10.8.93.80, 具体信息如上图所示 根据计算得知我的广播地址应该是10.8.93.255,不是10.8.93.254哦. 其它内容就直接上代码 server.js const dgram = require('dgram'); const server = dgram.createSocket('udp4'); const multicastAddr = '224.100.100.100'; server.on('close', () => { console.log('s

随机推荐