在IPv4中有一个专用的地址方位被用于组播管理,即224.0.0.0~239.255.255.255。组播参与者(包括发送端、接收端)在实际收发数据之间需要加入该范围中的一个地址;之后组中的所有终端都可以使用UDP方式向组中的其他终端发消息。
DatagramProtocol
datagramReceived():接收到UDP报文后处理的事件
startProtocol():当Protocol实例被第一次作为参数传给listenMulticast()时调用
关键函数
DatagramProtocol.transport.leaveGroup():离开组播
DatagramProtocol.transport.joinGroup():加入组播
DatagramProtocol.transport.setTTL(5) :设置多播数据包的生存时间
# coding:utf8
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
multicast_ip = '224.0.0.2'
port = 8001
class Multicast(DatagramProtocol):
def startProtocol(self):
'''
加入组播(必须重新)
:return:
'''
self.transport.setTTL(5) # 设置多播数据包的生存时间
self.transport.joinGroup(multicast_ip)
self.transport.write('Notify'.encode('utf8'),(multicast_ip,port))
def datagramReceived(self, datagram: bytes, addr):
'''
接收到组播发送的数据
:param datagram:
:param addr:
:return:
'''
print('Datagram %s received from %s '%(repr(datagram.decode('utf8')),repr(addr)))
if datagram.decode('utf8') == 'Notify':
self.transport.write('Acknowlege'.encode('utf8'),(multicast_ip,port))
def closeConnection(self):
'''
自定义函数,离开组播时调用
:return:
'''
self.transport.leaveGroup()
reactor.listenMulticast(port,Multicast(),listenMultiple=True)
reactor.run()