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

Non-QT server and QT client - connection using thrift

本文关键字:QT 连接 服务器 客户端      更新时间:2023-10-16

要求

客户端-服务器应用

通信将由节俭完成

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

客户将是基于Qt的


当前场景和问题

目前,服务器使用具有一定数量线程的TNonBlockingServer(使用线程管理器(

客户端连接到服务器并执行此任务。

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

目前程序只是给出了一个分段错误,所以我尝试使用try-catch,但没有成功。在搜索时,我注意到Qt不支持Exceptions。

经过进一步的搜索,我发现了这个,但它似乎是使用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();

为什么不使用这样的东西:

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");

如果客户端是基于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();
}

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

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

并且它工作得很好