我的python版本:2.7.8
节俭版本:0.9.2
python-thrift版本:0.9.2
操作系统:centOS 6.8
我的test.thrift文件:
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
答案 0 :(得分:8)
我猜这个问题已经过时了,但是我遇到了同样的错误信息。 事实证明,服务器端存在拼写错误。 thrift库试图使用Python日志记录来记录消息,但是我没有设置日志记录,所以它只是说,&#34;没有为logger找到处理程序&#34; thrift.server.TServer&# 34;&#34;
当我做一些最小的日志记录时,(将此代码添加到服务器端):
import logging
logging.basicConfig(level=logging.DEBUG)
日志记录向我展示了Python堆栈跟踪中的错字,我修复了它并再次起作用。 &#34; TSocket读取0字节&#34;错误意味着服务器出现异常并且没有写出消息。
答案 1 :(得分:3)
我的操作系统环境问题
我将端口30303
更改为9999
,它已成功运行。
答案 2 :(得分:0)
当你启动thrift服务时,你需要设置协议,如:./ hbase-daemon.sh start thrift -c compact protocol; 在你的代码中,你需要set protocol ='compact',比如thie:con = happybase.Connection(host ='localhost',port =你的thriftport,autoconnect = True,protocol ='compact',timeout = xxx)
答案 3 :(得分:0)
我遇到这个问题是因为我的实现提出了一个异常,即未指定要引发服务端点,我通过在端点规范的末尾添加throws ( 1: MyException exc)
来解决此问题。