Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.9
-
None
-
Thrift trunk (svn rev:1071191), python 2.7, FreeBSD/amd64 8-stable
Description
I'm trying to do some experiments with python and thrift, starting with the tutorials in the source code.
First test: making tutorials/py.twisted client and server interact.
Started the server with: tutorial/py.twisted]# python PythonServer.py
and the client with:
tutorial/py.twisted]# python PythonClient.py
Traceback (most recent call last):
File "PythonClient.py", line 26, in <module>
from tutorial import Calculator
ImportError: No module named tutorial
The problem is that PythonClient uses the python and not the py.twisted path: sys.path.append('../gen-py')
changing that to gen-py.twisted solves the problem:
tutorial/py.twisted]# python PythonClient.py
ping()
1+1=2
InvalidOperation: InvalidOperation(what=4, why='Cannot divide by 0')
15-10=5
Check log: 5
Second test: make python twisted server work with python (not the twisted one) client:
tutorial/py.twisted]# python PythonServer.py
tutorial/py]# python PythonClient.py
TSocket read 0 bytes
Please note here, that the server listens only on IPv4, 127.0.0.1, while the clients connects to 'localhost', which resolves to ::1 (IPv6) and 127.0.0.1, so the first connection request is refused and only the seconds succeeds:
12:07:24.887750 IP6 ::1.45100 > ::1.9090: Flags [S], seq 445533509, win 65535, options [mss 16324,nop,wscale 3,sackOK,TS val 7743539 ecr 0], length 0
12:07:24.887785 IP6 ::1.9090 > ::1.45100: Flags [R.], seq 0, ack 445533510, win 0, length 0
12:07:24.887924 IP 127.0.0.1.48945 > 127.0.0.1.9090: Flags [S], seq 3667752274, win 65535, options [mss 16344,nop,wscale 3,sackOK,TS val 7743539 ecr 0], length 0
12:07:24.887948 IP 127.0.0.1.9090 > 127.0.0.1.48945: Flags [S.], seq 3988782459, ack 3667752275, win 65535, options [mss 16344,nop,wscale 3,sackOK,TS val 1390952173 ecr 7743539], length 0
Changing localhost to 127.0.0.1 (to work around the first IPv6 connection request) changes nothing:
transport = TSocket.TSocket('localhost', 9090) -> transport = TSocket.TSocket('127.0.0.1', 9090)
tutorial/py]# python PythonClient.py
TSocket read 0 bytes
Trying the other way: starting the python server and connecting with python client:
tutorial/py]# python PythonServer.py
Starting the server...
Traceback (most recent call last):
File "PythonServer.py", line 95, in <module>
server.serve()
File "/usr/local/lib/python2.7/site-packages/thrift/server/TServer.py", line 74, in serve
self.serverTransport.listen()
File "/usr/local/lib/python2.7/site-packages/thrift/transport/TSocket.py", line 136, in listen
res0 = self._resolveAddr()
File "/usr/local/lib/python2.7/site-packages/thrift/transport/TSocket.py", line 31, in _resolveAddr
return socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)
TypeError: getaddrinfo() argument 1 must be string or None
Here it seems the problem is that no host has been given, and getaddrinfo fails on that.
Giving the listen address explicitly:
transport = TSocket.TServerSocket(9090) -> transport = TSocket.TServerSocket('127.0.0.1',9090)
makes the server start.
Connecting with the client:
tutorial/py]# python PythonClient.py
ping()
1+1=2
InvalidOperation: InvalidOperation(what=4, why='Cannot divide by 0')
15-10=5
Check log: 5
gives the expected result. So the python client can interact with the python server, but the
Looking at the code, I can't see why these two can't interact. BTW, I've tried the Ruby client, and it can work with the python server, but not with the python twisted server.
So I guess python twisted server (and so the client) is incompatible with everything else. Which seems pretty bad...
Or I'm just on the wrong track somewhere.