Клиент и сервер UDP с Twisted Python

Я хочу создать сервер и клиент, который будет отправлять и получать UDP-пакеты из сети, используя Twisted. Я уже написал это с помощью сокетов в Python, но хочу воспользоваться функциями обратного вызова и потоковой работы Twisted. Тем не менее, мне нужна помощь, хотя с дизайном Twisted.

У меня есть несколько типов пакетов, которые я хочу получать, но давайте представим, что есть только один:

class Packet(object):
    def __init__(self, data=None):
        self.packet_type = 1
        self.payload = ''
        self.structure = '!H6s'
        if data == None:
            return

        self.packet_type, self.payload = struct.unpack(self.structure, data)

    def pack(self):
        return struct.pack(self.structure, self.packet_type, self.payload)

    def __str__(self):
        return "Type: {0}\nPayload {1}\n\n".format(self.packet_type, self.payload)

Я создал класс протокола (почти прямая копия примеров), который, кажется, работает, когда я отправляю данные из другой программы. :

class MyProtocol(DatagramProtocol):
    def datagramReceived(self, data, (host, port)):
        p = Packet(data)
        print p

reactor.listenUDP(3000, MyProtocol())
reactor.run()

Чего я не знаю, так это как создать клиента, который может отправлять в сеть произвольные пакеты, которые получаются реактором:

# Something like this:
s = Sender()
p = Packet()
p.packet_type = 3
s.send(p.pack())
p.packet_type = 99
s.send(p.pack())

Мне также необходимо установить флаг повторного использования адреса на клиенте и серверах, чтобы я мог запускать несколько экземпляров каждого одновременно на одном устройстве (например, один сценарий отправляет тактовые импульсы, другой отвечает на тактовые импульсы и т. Д.). ).

Может кто-нибудь показать мне, как это можно сделать с помощью Twisted?

Обновление :

Вот как я это делаю с сокетами в Python. Я могу управлять несколькими слушателями и отправителями одновременно, и все они слышат друг друга. Как мне получить этот результат с помощью Twisted? (Слушающая часть не обязательно должна быть отдельным процессом.)

class Listener(Process):
    def __init__(self, ip='127.0.0.1', port=3000):
        Process.__init__(self)
        self.ip = ip
        self.port = port

    def run(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind((self.ip, self.port))

        data, from_ip = sock.recvfrom(4096)
        p = Packet(data)
        print p

class Sender(object):
    def __init__(self, ip='127.255.255.255', port=3000):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.ip = (ip, port)

    def send(self, data):
        self.sock.sendto(data, self.ip)

if __name__ == "__main__":
    l = Listener()
    l.start()
    s = Sender()
    p = Packet()
    p.packet_type = 4
    p.payload = 'jake'
    s.send(p.pack())

Рабочее решение :

class MySender(DatagramProtocol):
    def __init__(self, packet, host='127.255.255.255', port=3000):
        self.packet = packet.pack()
        self.host = host
        self.port = port

    def startProtocol(self):
        self.transport.write(self.packet, (self.host, self.port))

if __name__ == "__main__":
    packet = Packet()
    packet.packet_type = 1
    packet.payload = 'jake'

    s = MySender(packet)

    reactor.listenMulticast(3000, MyProtocol(), listenMultiple=True)
    reactor.listenMulticast(3000, s, listenMultiple=True)
    reactor.callLater(4, reactor.stop)
    reactor.run()
6
задан Jake 3 September 2010 в 17:31
поделиться