[Twisted-Python] Communicating between listeners
I'm new to Twisted, and network programming in general. Can anyone provide an example that might help me code the following functionality: * Server listens on two ports, one TCP, one UDP * Incoming UDP datagrams contain an identifying string * A message is broadcast to all connected TCP clients whose username matches the UDP ID. In particular, I can't work out how to access details of the current TCP clients - and trigger a new message to some of them - from the UDP listener. Many thanks Tom -----------------+ tom dyson t: +44 (0)1608 811870 m: +44 (0)7958 752657 http://torchbox.com
On Wed, 29 Sep 2004 16:22:32 +0100, tom dyson <tom.dyson@torchbox.com> wrote:
I'm new to Twisted, and network programming in general. Can anyone provide an example that might help me code the following functionality:
* Server listens on two ports, one TCP, one UDP * Incoming UDP datagrams contain an identifying string * A message is broadcast to all connected TCP clients whose username matches the UDP ID.
In particular, I can't work out how to access details of the current TCP clients - and trigger a new message to some of them - from the UDP listener.
Many thanks
Something like this, perhaps: from twisted.internet import protocol, reactor from twisted.application import service class SomeFactory(protocol.ServerFactory): def __init__(self, service): self.service = service def buildProtocol(self, addr): p = protocol.ServerFactory.buildProtocol(self, addr) self.service.addClient(p) return p class SomeDatagramProtocol(protocol.DatagramProtocol): def __init__(self, service): self.service = service def datagramReceived(self, dgram, addr): id, msg = extractStuff(dgram) self.service.broadcastMessage(id, msg) class FoobleService(service.Service): def startService(self): udpP = SomeDatagramProtocol(self) self.udpPort = reactor.listenUDP(..., udpP) tcpF = SomeFactory(self) self.tcpPort = reactor.listenTCP(..., tcpF) self.clients = [] def stopService(self): self.udpPort.stopListening() self.tcpPort.stopListening() del self.udpPort, self.tcpPort # The interesting bit def addClient(self, proto): self.clients.append(proto) def broadcastMessage(self, id, msg): for c in self.clients: if c.id == id: c.sendMessage(msg) In other words, construct a system for tracking clients, based on the callbacks Twisted does provide, and then access those clients as desired. Cleaning up after clients which drop their connection is left as an exercise for the reader. Jp
participants (2)
-
exarkun@divmod.com
-
tom dyson