On Wed, 29 Sep 2004 16:22:32 +0100, tom dyson email@example.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.
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.