使用TNonblockingServerSocket时,Thrift`recv failed`SocketException

时间:2015-02-03 00:52:44

标签: thrift

我正在尝试在客户端和服务器端使用TNonblockingServerSocketTFramedTransport,但会收到以下错误: TTransportException: java.net.SocketException: Software caused connection abort: recv failed

服务器代码:

TServerTransport serverTransport = new TNonblockingServerSocket(9090);
TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport);
args.processor(processor);
args.transportFactory(new TFramedTransport.Factory());
TServer server = new TThreadPoolServer(args);
server.serve();

客户代码:

transport = new TSocket("localhost", 9090);
transport.open();
TProtocol protocol = new  TBinaryProtocol(new TFramedTransport(transport));
Calculator.Client client = new Calculator.Client(protocol);

切换回TServerSocket而不是TNonblockingServerSocket时,一切正常 - 即使使用框架式传输也是如此。

知道我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:0)

我切换到THsHaServer而不是TThreadPoolServer,一切正常。奇怪。

我仍然不知道为什么它与TThreadPoolServer无关:(

答案 1 :(得分:0)

正如JensG先前的评论中提到的,TNonblockingServerSocket仅用于TNonblockingServer。

理论上,这些信息(以及一些其他类似信息)可能可以在Java的类型系统中进行编码。如果您有具体的建议,那么您可以在此处报告: https://issues.apache.org/jira/browse/THRIFT

实际上,在Java的类型系统(或C ++的类型系统,或在此插入随机语言)中编码某些类型信息可能太困难或繁重。在这些情况下,问题通常最好通过文档或快速失败来解决。