2014-09-12 97 views
0

我想實現一個方法來檢查服務器是否仍然運行。我使用套接字在服務器和客戶端之間進行通信。我的目標是向服務器打印換行符以測試它是否仍然運行,如果它不是IOException將被拋出,並且客戶端將進入重新連接過程。客戶端無限循環

我的問題是我停止終端服務器後,我的客戶端進入無限循環打印「響應從服務器:」,當它不應該。

代碼在客戶端:

private static void readResponse() throws IOException{ 
    String userInput; 
    try{ 
     BufferedReader stdIn = new BufferedReader(new InputStreamReader(contentSocket.getInputStream())); 

     System.out.println("Response from server:"); 
     while ((userInput = stdIn.readLine()) != null) { 
      System.out.println(userInput); 
     } 
    } catch(IOException e) { 
     System.err.println("Something went wrong (5)"); 
    } 
} 

private static void testConenction(Socket socket) throws IOException{ 
    try{ 
     PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
     writer.write("\n"); 
     writer.flush(); 
     writer.close(); 
    } catch(IOException e) { 
     System.err.println("Something went wrong (355)"); 
    } 
} 

    try{ 
    //Connection stuff 
     while(true){ 
      try{ 
       testConenction(contentSocket); 
       readResponse(); 
      } catch(IOException e) { 
       System.err.println("Something went wrong (327)"); 
       closeSocket(contentSocket); 
       System.out.println("Trying to re-establish connection"); 
       reconnect(); 
      } 
     } 

回答

0

看起來正確的,

while(true){ 
     try{ 
      testConenction(contentSocket); 
      readResponse(); 

這裏readResponse()在循環中被設置(在看不到盡頭)。相反,也許包括等待/睡眠並嘗試另一種方式。

如果您得到「來自服務器的響應:」,也許檢查userInput是否爲空/空,然後退出。

+0

從技術上講,沒有用戶輸入,它與客戶端的聯合服務器 – zeelo 2014-09-12 13:00:44

+0

我的錯誤,我應該更清楚,檢查這個用戶輸入是否爲空: private static void readResponse()throws IOException {userIQ; – 2014-09-12 13:01:11

+0

我明白你的意思了,但是如果userInput是空的,我應該打異常(5)。 readResponse()主要功能是檢索一個HTTP 200 – zeelo 2014-09-12 13:10:17

0

一旦連接已經建立了一個布爾標誌應當設置爲true,這將表示到服務器的連接已經建立。如果標誌被發現是真的,那麼我們將不再測試連接。

另外我想知道,如果我們在testConenction方法中捕獲IOException,那麼異常將不會傳播到調用方法。

+0

通過這個你的意思是交換而(真)與說,而(連接),其中連接是一個布爾值? – zeelo 2014-09-12 12:59:53

+0

是的。我認爲重要的是要保持一個指標,以瞭解曾經建立的連接。只有這樣,我們才能區分新的連接和斷開連接。 – SamDJava 2014-09-12 13:01:37

+0

執行布爾值後,可悲的是我仍然得到相同的結果。 – zeelo 2014-09-12 13:06:09

0

您在兩種方法中捕獲異常,以便不會引發異常327,並且永遠不會調用重新連接。

你不必檢查你是否得到答案,它是足以發送的東西。 TCP協議(由套接字使用)將確保服務器接收數據包,否則會引發異常。

+0

這解釋了一些奇怪的錯誤 – zeelo 2014-09-12 13:01:46