blob: eb2ec709ddbb660617247c1aa51e2cfbd87b8878 [file] [log] [blame]
Mark Sleec98d0502006-09-06 02:42:25 +00001import sys
2import traceback
Mark Slee3c4d7fd2006-10-02 17:53:20 +00003import threading
Mark Sleec98d0502006-09-06 02:42:25 +00004
Mark Sleec9676562006-09-05 17:34:52 +00005from thrift.Thrift import TProcessor
6from thrift.transport import TTransport
7
8class TServer:
9
Mark Slee794993d2006-09-20 01:56:10 +000010 """Base interface for a server, which must have a serve method."""
Mark Sleec9676562006-09-05 17:34:52 +000011
Mark Sleed788b2e2006-09-07 01:26:35 +000012 def __init__(self, processor, serverTransport, transportFactory=None):
13 self.processor = processor
14 self.serverTransport = serverTransport
15 if transportFactory == None:
16 self.transportFactory = TTransport.TTransportFactoryBase()
17 else:
18 self.transportFactory = transportFactory
Mark Sleec9676562006-09-05 17:34:52 +000019
Mark Slee794993d2006-09-20 01:56:10 +000020 def serve(self):
Mark Sleec9676562006-09-05 17:34:52 +000021 pass
22
23class TSimpleServer(TServer):
24
25 """Simple single-threaded server that just pumps around one transport."""
26
Mark Sleed788b2e2006-09-07 01:26:35 +000027 def __init__(self, processor, serverTransport, transportFactory=None):
28 TServer.__init__(self, processor, serverTransport, transportFactory)
Mark Sleec9676562006-09-05 17:34:52 +000029
Mark Slee794993d2006-09-20 01:56:10 +000030 def serve(self):
Mark Sleed788b2e2006-09-07 01:26:35 +000031 self.serverTransport.listen()
Mark Sleec9676562006-09-05 17:34:52 +000032 while True:
Mark Sleed788b2e2006-09-07 01:26:35 +000033 client = self.serverTransport.accept()
34 (input, output) = self.transportFactory.getIOTransports(client)
Mark Sleec9676562006-09-05 17:34:52 +000035 try:
36 while True:
Mark Sleed788b2e2006-09-07 01:26:35 +000037 self.processor.process(input, output)
Mark Slee4f0fed62006-10-02 17:50:08 +000038 except TTransport.TTransportException, tx:
39 pass
Mark Sleec9676562006-09-05 17:34:52 +000040 except Exception, x:
Mark Sleec98d0502006-09-06 02:42:25 +000041 print '%s, %s, %s' % (type(x), x, traceback.format_exc())
Mark Sleed788b2e2006-09-07 01:26:35 +000042
43 input.close()
44 output.close()
Mark Slee4f0fed62006-10-02 17:50:08 +000045
46class TThreadedServer(TServer):
47
48 """Threaded server that spawns a new thread per each connection."""
49
50 def __init__(self, processor, serverTransport, transportFactory=None):
51 TServer.__init__(self, processor, serverTransport, transportFactory)
52
53 def serve(self):
54 self.serverTransport.listen()
55 while True:
56 try:
57 client = self.serverTransport.accept()
58 t = threading.Thread(target = self.handle, args=(client,))
59 t.start()
60 except Exception, x:
61 print '%s, %s, %s,' % (type(x), x, traceback.format_exc())
62
63 def handle(self, client):
64 (input, output) = self.transportFactory.getIOTransports(client)
65 try:
66 while True:
67 self.processor.process(input, output)
68 except TTransport.TTransportException, tx:
69 pass
70 except Exception, x:
71 print '%s, %s, %s' % (type(x), x, traceback.format_exc())