【发布时间】:2014-09-26 21:57:46
【问题描述】:
要求
客户端服务器应用程序
通信将由thrift完成
服务器将在后台运行或通过没有 GUI 的终端调用
客户端将基于 Qt
当前场景和问题
目前,服务器使用TNonBlockingServer 和一定数量的线程(使用线程管理器)
客户端连接到服务器并完成工作。
但是,有一个特定的要求,如果我的服务器没有运行并且客户端尝试连接到它,那么应该在客户端的屏幕上显示一个消息框。
目前程序只是给出了一个分段错误,所以我尝试使用 try catch,它没有工作。搜索后我注意到 Qt 不支持异常。
经过更多搜索,我发现了This,但这似乎是在使用 QT(我仍然不知道我的问题是否可以通过这个解决)
服务器代码:
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<workerHandlerHandler> handler(new workerHandlerHandler());
shared_ptr<TProcessor> processor(new workerHandlerProcessor(handler));
shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(15);
shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
TNonblockingServer server(processor, protocolFactory, port,threadManager);
server.serve();
客户端连接使用
boost::shared_ptr<TSocket> socket(new TSocket(serverip.toUtf8().data(), 59999));
boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
workerHandlerClient client(protocol);
transport->open();
int pingValue = client.ping();
transport->close();
【问题讨论】:
-
段错误表明存在一些无效的指针访问。这是在哪里发生的,为什么你不能检查那个条件(例如 NULL 指针)?拥有整个错误消息将是一件好事......
-
既然你不回答问题,似乎问题已经解决了:给出的答案有什么问题吗?
-
嗯,给出的答案实际上是使用 QT 类(QTcpSocket)连接到服务器,现在我正在使用 thrift,我实际上不能使用这些类进行 RPC 调用。关于这个问题,它会导致 TThriftException,如果我使用它,就会出现这个问题。但是,作为当前的解决方法,我使用 std::Exception 来防止程序崩溃。但是关于那个 TThriftException,我还在寻找捕捉它的方法
标签: c++ qt exception rpc thrift