0

我正在尝试使用 Apache thrift RPC 框架在 PHP 客户端和 C++ 服务器之间建立通信。经过数小时无果而终的调试后,我从同一个 thrift 文件构建了一个 java 服务器并让一切正常工作。当我运行 C++ 服务器时,我的任何方法都不会被调用,并且从 java 服务器获得响应的同一个客户端会引发异常Exception: TSocket: timed out reading 4 bytes from localhost:65123(即使我已将客户端上的传输和接收超时都设置为 5 秒。)至少这个错误与我在服务器未运行时得到的错误 [ TSocket: Could not connect to localhost:65123 (Connection refused [111])] 不同,所以我知道 C++ 服务器至少绑定到客户端正在与之通信的端口。

(工作的)java服务器代码是:

public class Server 
{
    public static void Start(EncabulationGame.Processor<EncabulationInputListener> processor)
    {
        try
        {
            TServerTransport serverTransport = new TServerSocket(65123);
            TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
            System.out.println("Starting the simple server...");
            server.serve();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }


    public static void main(String[] args)
    {
        Start(new EncabulationGame.Processor<EncabulationInputListener>(new EncabulationInputListener()));
    }

}

(非工作)C++ 服务器在与我的应用程序的主处理线程分开的线程中生成。代码如下所示:

void* ListenerThreadEntryPoint(void* threadStartData)
{
    struct InputListenerThreadStartupData * threadData;
    threadData =  ((struct InputListenerThreadStartupData *) threadStartData);
    int port = threadData->ListnerThreadPort;

    shared_ptr<EncabulationGameHandler> handler(new EncabulationGameHandler(threadData));
    shared_ptr<TProcessor> processor(new EncabulationGameProcessor(handler));
    shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
    shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
    shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
    TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
    server.serve();

    return 0;
}

java 和 C++ 服务器代码片段都是从 thrift 编译器生成的骨架代码中剪切和粘贴的。

我真的想不通。为什么我的 C++ 服务器没有响应客户端?为什么我的处理程序(构造函数除外)中的任何方法都没有被调用?我将非常感谢社区可以提供的任何帮助。我正在使用节俭的 0.9.0 版本。

如果有帮助,这是实现我的处理程序的代码:

class EncabulationGameHandler : virtual public EncabulationGameIf {
 public:
  EncabulationGameHandler(InputListenerThreadStartupData * threadData) {
    // Your initialization goes here
  }

  int32_t RegisterPlayer() {
    // Your implementation goes here
    printf("RegisterPlayer\n");
  }

  void UnRegisterPlayer(const int32_t playerID) {
    // Your implementation goes here
    printf("UnRegisterPlayer\n");
  }

  bool IsGameRunning() {
    // Your implementation goes here
    printf("IsGameRunning\n");
  }

  int32_t GetPlayerScore(const int32_t playerID) {
    // Your implementation goes here
    printf("GetPlayerScore\n");
  }

  void Bounce(const int32_t playerID) {
    // Your implementation goes here
    printf("Bounce\n");
  }

  void ChangeColor(const int32_t playerID) {
    // Your implementation goes here
    printf("ChangeColor\n");
  }

};
4

2 回答 2

0

你没有给我们足够的继续 - 所以看看差异并为自己编写最简单的 C++ 服务器,你可以与你的独立 java 服务器相同(例如,运行 C++ 服务器而不在线程中)

C++ 代码看起来很像节俭骨架中的自动生成内容,所以我看不出这怎么可能是错误的。

于 2013-04-25T08:30:41.427 回答
0

回答我自己的问题后,我设法通过使用多线程 Thrift 服务器模型解决了这个问题。我从来没有弄清楚为什么上面发布的代码片段不起作用。

于 2013-05-02T19:52:48.043 回答