【Python】局域网多播技术简单实现
一、前言
之前在写工具的时候,产生了一个实现局域网协作功能的想法,刚开始准备采用TCP协议实现C/S模式的局域网广播通信方式。后来经过一番的搜索后发现可以使用局域网多播技术实现,这个技术上手不难,经过几天的捣鼓,最后顺利完成,因此分享给大家。
二、什么是多播
“多播”也称为“组播”,是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。组播可以极大地节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。分类集中控制、网上视频会议、网上视频点播特别适合采用多播方式。
多播的地址是特定的,D类IP地址就是多播IP地址,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址3类:
局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。
预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。
管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
三、多播发送者(服务端)
import socket import time Broadcast_Addr = '224.0.0.100' Broadcast_Port = 10001 #多播协议采用UDP sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP) #绑定发送端口 sock.bind(("0.0.0.0",1101)) #设置socket为多播类型 sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL, 255) while True: # 将'Hello Everybody'发送到多播地址的指定端口 # 属于这个多播组的成员都可以收到这个信息 sock.sendto('Hello Everybody',(Broadcast_Addr,Broadcast_Port)); time.sleep(10)
多播源(服务端)实现比较简单,主要需要关注以下3个地方:
1、创建的socket必须是UDP类型。
2、设置socket类型为多播方式,使用多播方式发送。
3、发送的目标地址必须是D类多播的IP地址。
四、多播接收者(客户端)
import socket ANY = '0.0.0.0' Broadcast_Addr= '224.0.0.100' Broadcast_Port= 10001 #多播协议采用UDP sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) #允许端口复用 sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #绑定监听多播数据包的端口 sock.bind(("0.0.0.0",Broadcast_Port)) #告诉内核这是一个多播类型的socket sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) #告诉内核把自己加入指定的多播组,组地址由第三个参数指定 status = sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(Broadcast_Addr) + socket.inet_aton(ANY)); # 设置为非阻塞 sock.setblocking(0) while True: try: # 接收数据 data, addr = sock.recvfrom(1024) print("recvdata: ",data, "from: ",addr) except socket.error, e: pass
多播客户端与服务端基本类似,关键代码是通过(socket.IP_ADD_MEMBERSHIP)把自己加入多播组以及监听在多播服务器指定的多播端口。
五、结语
总的来说还是比较简单,记住关键内容然后结合实际编写,我相信很快就会掌握,说不定马上就可以写一个简单的局域网聊天工具了呢。
欢迎微信搜索"游戏测试开发"关注一起沟通交流。