![](/img/trans.png)
[英]Example on how to use TFileTransport in Thrift (Client/Server)
[英]Trying to get a Python client talk to a Java Server using thrift's TFileTransport and TFileProcessor
我正在嘗試使用thrift的TFileTransport包裝要從Python調用的Java類。 我嘗試使用兩個協議TJSON和TBinary,但我一直得到這個例外
org.apache.thrift.transport.TTransportException: FileTransport error: bad event size
at org.apache.thrift.transport.TFileTransport.readEvent(TFileTransport.java:327)
at org.apache.thrift.transport.TFileTransport.read(TFileTransport.java:468)
at org.apache.thrift.transport.TFileTransport.readAll(TFileTransport.java:439)
at org.apache.thrift.protocol.TJSONProtocol$LookaheadReader.read(TJSONProtocol.java:263)
at org.apache.thrift.protocol.TJSONProtocol.readJSONSyntaxChar(TJSONProtocol.java:320)
at org.apache.thrift.protocol.TJSONProtocol.readJSONArrayStart(TJSONProtocol.java:784)
at org.apache.thrift.protocol.TJSONProtocol.readMessageBegin(TJSONProtocol.java:795)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
at org.apache.thrift.transport.TFileProcessor.processUntil(TFileProcessor.java:69)
at org.apache.thrift.transport.TFileProcessor.processChunk(TFileProcessor.java:102)
at org.apache.thrift.transport.TFileProcessor.processChunk(TFileProcessor.java:111)
at org.apache.thrift.transport.TFileProcessor.processChunk(TFileProcessor.java:118)
at com.netflix.suro.client.SendToPyServer.startThriftServer(SendToPyServer.java:51)
at com.netflix.suro.client.SendToPyServer.main(SendToPyServer.java:67)
這就是我的Python客戶端的外觀:
def __init__(self):
self.outFile=open("../../ThriftFile.in","a")
self.transport = TTransport.TFileObjectTransport(self.outFile)
self.protocol = TJSONProtocol.TJSONProtocol(self.transport)
self.client = sendPyInterface.Client(self.protocol)
self.transport.open()
def send(self,routingKey, message):
self.transport.write(pickle.dumps(self.client.send_send(routingKey, message)))
def configClient(self,configurationDict):
self.transport.write(pickle.dumps(self.client.send_ClientConfig(configurationDict)))
if __name__ == "__main__":
SuroClient=SuroPyClient()
configurationDict={"ClientConfig.LB_TYPE":"static","ClientConfig.LB_SERVER":"localhost:7101"}
SuroClient.configClient(configurationDict)
SuroClient.send("routingKey", "testMessage")
這是我的服務器:
public static void startThriftServer(SendPyInterface.Processor processor) {
try {
File input = new File("src/main/java/com/netflix/suro/client/ThriftFile.in");
if(!input.exists()){
input.createNewFile();
}
File output = new File("src/main/java/com/netflix/suro/client/ThriftFile.out");
if(!output.exists()){
output.createNewFile();
}
TFileTransport inputFileTransport = new TFileTransport(input.getAbsolutePath(), true);
TFileTransport outputFileTransport = new TFileTransport(output.getAbsolutePath(), false);
System.out.println(input.getAbsolutePath());
System.out.println(input.length());
inputFileTransport.open();
outputFileTransport.open();
System.out.println(inputFileTransport.getBytesRemainingInBuffer());
inputFileTransport.setTailPolicy(tailPolicy.WAIT_FOREVER);
System.out.println("Wait ...");
System.out.println(inputFileTransport.getBuffer());
TFileProcessor fProcessor =
new TFileProcessor(processor, new TJSONProtocol.Factory(), inputFileTransport, outputFileTransport);
try {
fProcessor.processChunk();
} catch (TTransportException e) {
e.printStackTrace();
}
System.out.println("File Thrift service started ...");
} catch (Exception e) {
e.printStackTrace();
}
我已經跟隨了這個帖子中的示例: 如何在Thrift中使用TFileTransport的示例(客戶端/服務器)
並從這篇文章: http : //theprogrammersguideto.com/thrift/blog/code/chapter-3-moving-bytes-with-transports/
根據舊Thrift wiki中的文檔 ,Java和C ++ TFileTransport實際上是一個成幀傳輸 ,它在數據之前寫入一個額外的4字節頭。 似乎這里的名字有點誤導。
相比之下,使用的Python TFileObjectTransport只是一個簡單的包裝器。 這意味着傳輸不兼容,因此錯誤消息。
因此, TSimpleFileTransport
應該與Java一起使用,而不是TFileTransport
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.