2013-04-25 156 views
0

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

}; 

回答

0

回答我自己的問題,我設法通過使用多線程Thrift服務器模型來解決這個問題。我從來沒有弄清楚爲什麼上面發佈的代碼片段不起作用。

0

你沒有給我們足夠的去 - 這樣看的差異,並自己編寫簡單的C++服務器,你可以是這樣的與你的獨立Java相同(例如,他沒有在一個線程中的C++服務器)

C++代碼看起來很像從節儉框架中自動生成的東西,所以我看不出如何可能是錯誤的。