2016-09-07 24 views
5

私のPythonのバージョン読む:2.7.8
古道具バージョン:0.9.2
のpython-古道具バージョン:0.9.2
OS:CentOSの6.8
私をtest.thriftファイル:Pythonのリサイクルエラー `` `TSocketが0 bytes```

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(), 
    string sayHello(), 
    string sayMsg(1:string msg) 
} 

client.py

# -*-coding:utf-8-*- 

from test import HelloWorld 
from test.constants import * 

from thrift import Thrift 
from thrift.transport import TSocket 
from thrift.transport import TTransport 
from thrift.protocol import TBinaryProtocol 


# Make socket 
transport = TSocket.TSocket('192.168.189.156', 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() 

server.py:

# -*-coding:utf-8-*- 

from test.HelloWorld import Processor 
from thrift.transport import TSocket 
from thrift.transport import TTransport 
from thrift.protocol import TBinaryProtocol 
from thrift.server import TServer 


class HelloWorldHandler(object): 
    def __init__(self): 
     self.log = {} 

    def ping(self): 
     print "ping()" 

    def sayHello(self): 
     print "sayHello()" 
     return "say hello from 156" 

    def sayMsg(self, msg): 
     print "sayMsg(" + msg + ")" 
     return "say " + msg + " from 156" 


handler = HelloWorldHandler() 
processor = Processor(handler) 
transport = TSocket.TServerSocket("192.168.189.156", 30303) 
tfactory = TTransport.TBufferedTransportFactory() 
pfactory = TBinaryProtocol.TBinaryProtocolFactory() 

server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory) 

print "Starting python server..." 
server.serve() 
print "done!" 

マイエラー:

ping() 
Traceback (most recent call last): 
    File "client.py", line 29, in <module> 
    msg = client.sayHello() 
    File "/home/zhihao/bfd_mf_report_warning_service/local_test/test/HelloWorld.py", line 68, in sayHello 
    return self.recv_sayHello() 
    File "/home/zhihao/bfd_mf_report_warning_service/local_test/test/HelloWorld.py", line 79, in recv_sayHello 
    (fname, mtype, rseqid) = iprot.readMessageBegin() 
    File "build/bdist.linux-x86_64/egg/thrift/protocol/TBinaryProtocol.py", line 126, in readMessageBegin 
    File "build/bdist.linux-x86_64/egg/thrift/protocol/TBinaryProtocol.py", line 206, in readI32 
    File "build/bdist.linux-x86_64/egg/thrift/transport/TTransport.py", line 58, in readAll 
    File "build/bdist.linux-x86_64/egg/thrift/transport/TTransport.py", line 159, in read 
    File "build/bdist.linux-x86_64/egg/thrift/transport/TSocket.py", line 120, in read 
thrift.transport.TTransport.TTransportException: TSocket read 0 bytes 

答えて

3

私のOS環境問題。
ポート303039999に変更すると、正常に実行されます。

+0

実際、コードにはバグがあります。私はthriftサーバーのポート30303をリッスンし、エラーは発生しません。 – user3410960

4

この質問は古いと思いますが、同じエラーメッセージが表示されます。 サーバー側にタイプミスがあることが判明しました。倹約図書館はPythonログを使ってメッセージを記録しようとしていましたが、ログを設定していないので、 "ログサーバー" thrift.server.TServer "のハンドラーは見つかりませんでした。私はいくつかの最低限のロギング、(サーバ側にこのコードを追加)をやったとき

は:

import logging 
logging.basicConfig(level=logging.DEBUG) 

ログは、Pythonのスタックトレースに私に私のタイプミスを示した私はそれを固定し、それが再び働きました。 "TSocket read 0 bytes"エラーは、サーバーに例外が発生し、メッセージを書き出さなかったことを意味します。

関連する問題