我正在嘗試使用Apache thrift RPC框架在PHP客戶機和C++服務器之間建立通信。經過幾個小時的無果調試之後,我從同一個節儉文件構建了一個java服務器,並開始工作。當我運行C++服務器時,我的任何方法都不會被調用,並且從java服務器獲得響應的同一客戶端會拋出異常Exception: TSocket: timed out reading 4 bytes from localhost:65123
(即使我已將客戶端上的傳輸和接收超時設置爲5秒。 )至少這個錯誤與我在服務器沒有運行時得到的錯誤不同[],所以我知道C++服務器至少綁定到客戶端正在與之通話的端口。Thrift C++服務器超時,java服務器不支持
的(工作)的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++的服務器代碼片段剪切並粘貼從儲蓄機構編譯器生成的骨架代碼。
我真的不知道這一點。爲什麼我的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");
}
};