Tuesday, July 13, 2010
Thrift Server-Client in Python
1. Write Thrift stub code
[tkang@neb005 thrift]$ vi helloworld.thrift
1 2 3 4 5 6 7 8 9 10 11 | const string HELLO_IN_KOREAN = "an-nyoung-ha-se-yo"const string HELLO_IN_FRENCH = "bonjour!"const string HELLO_IN_JAPANESE = "konichiwa!"service HelloWorld { void ping(), i32 sayHello(), i32 sayMsg(1:string msg)} |
2. Generate python code
[tkang@neb005 thrift]$ thrift --gen py helloworld.thrift
Generated codes will be saved under "gen-py" directory.
[tkang@neb005 thrift]$ ls
gen-py helloworld.thrift
3. Fill in Server code
[tkang@neb005 thrift]$ mkdir py-impl
[tkang@neb005 thrift]$ cd py-impl
[tkang@neb005 py-impl]$ vi PythonServer.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #!/usr/bin/env pythonimport syssys.path.append('../gen-py')from helloworld import HelloWorldfrom helloworld.ttypes import *from thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocolfrom thrift.server import TServerimport socketclass HelloWorldHandler: def __init__(self): self.log = {} def ping(self): print "ping()" def sayHello(self): print "sayHello()" return "say hello from " + socket.gethostbyname(socket.gethostname()) def sayMsg(self, msg): print "sayMsg(" + msg + ")" return "say " + msg + " from " + socket.gethostbyname(socket.gethostname())handler = HelloWorldHandler()processor = HelloWorld.Processor(handler)transport = TSocket.TServerSocket(30303)tfactory = TTransport.TBufferedTransportFactory()pfactory = TBinaryProtocol.TBinaryProtocolFactory()server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)print "Starting python server..."server.serve()print "done!" |
4. Write Client code to connect to server
[tkang@neb005 py-impl]$ vi PythonClient.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #!/usr/bin/env pythonimport syssys.path.append('../gen-py')from helloworld import HelloWorldfrom helloworld.ttypes import *from helloworld.constants import *from thrift import Thriftfrom thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocoltry: # Make socket transport = TSocket.TSocket('localhost', 30303) # Buffering is critical. Raw sockets are very slow transport = TTransport.TBufferedTransport(transport) # Wrap in a protocol protocol = TBinaryProtocol.TBinaryProtocol(transport) # Create a client to use the protocol encoder client = HelloWorld.Client(protocol) # Connect! transport.open() client.ping() print "ping()" msg = client.sayHello() print msg msg = client.sayMsg(HELLO_IN_KOREAN) print msg transport.close()except Thrift.TException, tx: print "%s" % (tx.message) |