我正在尝试使用 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");
}
};