我正在尝试使用Visual Studio 2015在C ++中编写的非常简单的Apache Thrift服务器和客户端。该代码基于官方的Apache Thrift示例。
我正在使用最新版本的Thrift(0.10.0),Boost(1.64.0)和OpenSSL(1.1.0e)。
从客户端到服务器的每次调用都会在TTransport.h第43行触发TTransportException:
throw TTransportException(TTransportException::END_OF_FILE, "No more data to read.");
这是我的test.thrift文件:
namespace cpp test
service Test {
void ping()
}
thrift编译器生成Test.h,它在服务器和客户端中都是#included(不显示实际代码,因为它是自动生成的)。
客户端和服务器中包含的thrift头文件:
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TTransportUtils.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <Test.h>
客户主要:
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using namespace std;
int main()
{
boost::shared_ptr<TTransport> socket(new TSocket("localhost", 9090));
boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
test::TestClient client(protocol);
try {
transport->open();
client.ping();
cout << "ping()" << endl;
transport->close();
}
catch (TException& tx) {
cout << "ERROR: " << tx.what() << endl;
}
return 0;
}
和服务器主:
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using namespace std;
class TestHandler : virtual public test::TestIf {
public:
TestHandler() {
// Your initialization goes here
}
void ping() {
// Your implementation goes here
printf("ping\n");
}
};
int main()
{
std::cout << "Starting thrift server thread" << std::endl;
int port = 9090;
boost::shared_ptr<TestHandler> handler(new TestHandler());
boost::shared_ptr<TProcessor> processor(new test::TestProcessor(handler));
boost::shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
boost::shared_ptr<TTransportFactory> transportFactory(new TFramedTransportFactory());
boost::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
boost::shared_ptr< apache::thrift::server::TSimpleServer > server = boost::shared_ptr< TSimpleServer>(new TSimpleServer(processor, serverTransport, transportFactory, protocolFactory));
server->serve();
return 0;
}
我也尝试过使用TBufferedTransport和TJSONProtocol,结果相同。
抛出异常的事实表明这不是正常运行,但是,接收和处理调用(在调用TestHandler :: ping()之后发生异常)并且服务器继续收听和接收请求(每次触发相同的错误),因此它是可恢复的条件。
所以我想知道为什么会发生这种情况,是否可以/应该修复,以及如果不是这样,尽管有这种例外,使用服务器是否安全。
答案 0 :(得分:2)
按设计。
Thrift库以这种方式实现,其中通过抛出TTransportException
在内部发信号通知连接的结束。