python實現組播通訊

python3標準庫中提供了socketserver庫來提供快速的TCP和UDP服務的實現,在工做中接觸到了組播的問題,爲了方便的測試業務,經過繼承UDPServer類,並override了server_bind方法,實現了一個能夠快速搭建組播服務的類,經過建立一個MulticastServer實例就能夠進行組播通訊了python

import socket
from socketserver import UDPServer, DatagramRequestHandler

MCASTADDR = '225.12.3.1'
PORT = 3232
INTERFACE = '192.168.10.11'

class MulticastHandler(DatagramRequestHandler):
    def handle(self):
        print('get a multicast message:',self.rfile.readline())

class MulticastServer(UDPServer):
    """
    Multicast UDP server class
    """
    allow_reuse_address = True
    multicast_loop = True
    def __init__(self, interface, server_address, RequestHandlerClass, ttl=1, bind_and_activate=True):
        """Constructor.  May be extended, do not override."""
        self.interface = interface
        self.ttl = ttl
        UDPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate)

    def server_bind(self):
        if self.allow_reuse_address:
            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        #self.socket.bind((interface,server_address[1])) # for windows we need use this type
        self.socket.bind(self.server_address)
        if self.multicast_loop:
            self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) # set the socket option: allow the packet recieved by localhost
        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, \
            socket.inet_aton(self.server_address[0])+socket.inet_aton(self.interface)) # set the socket option: IP_ADD_MEMBERSHIP to join the group
        if self.ttl != 1:
            self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, self.ttl) # set the socket option: IP_MULTICAST_TTL
        self.server_address = self.socket.getsockname()




def main():
    multiserver=MulticastServer(INTERFACE, (MCASTADDR,PORT), MulticastHandler)
    multiserver.serve_forever()

if __name__ == '__main__':
    main()

發送端的代碼能夠參考:http://blog.csdn.net/ztb3214/article/details/19285363linux

 

注意:DatagramRequestHandler的在收到消息後會調用finish方法,finish方法會默認向客戶端發送一個長度爲0的udp報文,若是不想發送這個報文,須要重寫finish方法windows

PS: windows下和linux下進行bind的時候bind的參數不太一致,linux下bind的是組播地址,windows下bind的本機的IP地址,爲何出現這樣的不一致還沒弄清楚,有了解的大神請不吝賜教socket

相關文章
相關標籤/搜索