【问题标题】:Non-QT server and QT client - connection using thrift非 QT 服务器和 QT 客户端 - 使用 thrift 连接
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      而且效果很好

      【讨论】:

      • 为什么有人认为我的回答是错误的。我对其进行了测试,并且效果很好。我真的无法理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2016-04-16
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多