非QT服务器和QT客户端 - 使用thrift连接

时间:2014-08-04 12:15:44

标签: c++ qt exception rpc thrift

需要量

客户端服务器应用程序

通过节俭进行沟通

服务器将在后台运行或通过没有GUI的终端调用

客户端将基于Qt


当前情景和问题

目前,服务器使用TNonBlockingServer一定数量的线程(使用threadmanager)

客户端连接到服务器并完成工作。

但是,有一定的要求,如果我的服务器没有运行而客户端尝试连接到它,那么应该在客户端的屏幕上显示一个消息框。

目前程序只是给出了一个分段错误,所以我尝试使用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();

3 个答案:

答案 0 :(得分:0)

为什么不使用类似的东西:

QTcpSocket *socket = new QTcpSocket();
socket->connectToHost(serverip, serverport);
if(!socket->waitForConnected(time-in-msecs))
  QMessageBox::critical(some-ui-window-as-parent, "Error Title", "Error connecting Text");

答案 1 :(得分:0)

如果客户端是基于Qt的,您可以使用QTcpSocket连接服务器:

QTcpSocket clientSocket;

通过将客户端套接字的error信号连接到插槽,可以在发生错误时显示相应的消息框。如果服务器未运行且客户端尝试连接,则会调用插槽并显示包含错误的消息框:

connect( &clientSocket, SIGNAL(error(QAbstractSocket::SocketError)),
        this, SLOT(tcpError(QAbstractSocket::SocketError)) );

clientSocket.connectToHost(ipAddress, portNo );

插槽如下:

void MyClass::tcpError(QAbstractSocket::SocketError error)
{

    QMessageBox::warning( this, tr("Error"),tr("TCP error: %1").arg( clientSocket.errorString() ) );

    clientSocket.disconnectFromHost();

}

答案 2 :(得分:-1)

我不知道你的意思。只是支持尝试和捕捉。 现在,我正在开发一个与您的程序类似的程序。 我也使用No-QT服务器和QT客户端,但在我的代码中我使用如下结构:

try
{
}
catch(TException e)
{
    QMessageBox::information(this, "Warn", "Thrift server has shut down");
}

效果很好

相关问题