[Twisted-Python] robust listenUDP with N clients?

marc bohlen marcbohlen at acm.org
Mon Dec 4 10:28:57 EST 2006


hi folks

I am new to twisted and new to server programming. Nonetheless, I would 
like to build a robust client-server looping mechanism in which a server 
would listen for input from N clients, say 10, and react immediately 
when it receives data from them. I have a sample (see below) that 
appears to run well, but am not sure if it will scale under real network 
load and larger N.
(I am parsing the input data received from the clients and using it to 
calculate a fibonnaci series, just for testing. The reactor can be 
stopped with keyboard input (I am on a win32 platform)).

If you see any problems with this approach, please let me know !
Thanks, marc

CODE:

import os, sys, time, msvcrt
from twisted.internet import reactor, defer, task
from twisted.internet.protocol import DatagramProtocol
ports = [1007, 2007, 3007, 4007, 5007, 6007, 7007, 8007, 9007]
#----------------------------
def check_keyboard(result):
   try:
       if(msvcrt.kbhit()):
           result = "hit"
   except:         pass

   return result
#---------------------------
def mstop(result):
   if(result == "hit"):
       print "got hit - closing task and reactor"
       mtask.stop()
       reactor.stop()
#---------------------------
def print_time(result):
   print time.asctime(time.localtime())
#---------------------------
def fibonnaci(limit):
   first, new, second = 0,0,1
   for i in xrange(limit - 1):
       new = first + second
       first = second
       second = new
   return new
#---------------------------
def mrun():
   d = defer.Deferred()
   d.addCallback(check_keyboard)
   d.addCallback(mstop)
   d.addCallback(print_time)
   d.callback("blabla")
#---------------------------
class server(DatagramProtocol):
   def datagramReceived(self, data, (host, port)):
       print "server received: %r from %s:%d" % (data, host, port)
       self.transport.write(data, (host, port))
       limit = int(data.split(": ")[1])
       num = fibonnaci(limit)
   print num
#---------------------------

if __name__ == '__main__':
   print "listening on 9 ports - hit key to quit"
   mrun()
   mtask = task.LoopingCall(mrun)
   mtask.start(1.0)
   for i in range (0,(len(ports))):
       reactor.listenUDP(ports[i], server())
reactor.run()
#--------------------------







More information about the Twisted-Python mailing list