需要量
客户端服务器应用程序
通过节俭进行沟通
服务器将在后台运行或通过没有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();
答案 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");
}
效果很好