2010-05-22 55 views
1

我是一個真正的java新手,所以請原諒我,如果這是一個絕望的直接問題。Java if/else behaviour奇怪

我從我的Java遊戲服務器執行以下操作:

所有的
// Get input from the client 
    DataInputStream in = new DataInputStream (server.getInputStream()); 
    PrintStream out = new PrintStream(server.getOutputStream()); 
    disconnect=false; 

    while((line = in.readLine().trim()) != null && !line.equals(".") && !line.equals("") && !disconnect) { 
     System.out.println("Received "+line); 

     if(line.equals("h")){ 
      out.println("h"+EOF); // Client handshake 
      System.out.println("Matched 1"); 

     }else if (line.equals("<policy-file-request/>")) { 
      out.println("..."+EOF); // Policy file 
      System.out.println(server.getInetAddress()+": Policy Request"); 
      disconnect=true; 
      System.out.println("Matched 2"); 

     }else if(line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST")){ 
      out.println("HTTP/1.0 200 OK\nServer: VirtuaRoom v0.9\nContent-Type: text/html\n\n..."); // HTML status page 
      disconnect=true; 
      System.out.println("Matched 3"); 


     } else { 
      System.out.println(server.getInetAddress()+": Unknown command, client disconnected."); 
      disconnect=true; 
      System.out.println("Matched else"); 

     } 

    } 
    server.close(); 

首先,客戶端發送一個「H」數據包,並希望同退(握手)。但是,我希望它在收到無法識別的數據包時斷開客戶端連接。出於某種原因,它對握手和HTML狀態請求做出了很好的響應,但是當存在未知數據包時,else子句從不執行。

感謝

+1

什麼是未知包的內容替換substring().equals?你可以打印出來,然後你可以至少遍歷代碼,看看可能發生了什麼。當存在「未知」數據包時會發生什麼? – DaveJohnston 2010-05-22 10:19:47

+0

OT,但是:'(line = in.readLine()。trim())!= null'會讓你在流結束時遇到麻煩,它會拋出一個'NullPointerException',因爲你會嘗試在'readLine'返回的'null'上調用'trim'。 – 2010-05-22 10:21:05

+0

你能告訴我們什麼「收到」調試行顯示你的測試未知數據包? – 2010-05-22 10:22:14

回答

5

從您的評論中添加的信息看來,會發生什麼是客戶端正在發送一個字符(例如'n')。該生產線

line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST")) 

將被執行,但由於line只有一個字符line.substring(0,3)將拋出一個StringIndexOutOfBoundsException。無論是這導致你的程序失敗,你還沒有提到。或者你有一些異常處理在你沒有顯示的代碼的另一部分進行,這可能會導致錯誤或者打印日誌行或者你沒有提到過(或者注意到它)。

嘗試用startsWith

+0

這樣做伎倆,非常感謝! 我實際上是壓制StringIndexOutOfBoundsException,不知道會影響它,再次感謝! – Alex 2010-05-22 10:45:42

1
  1. 你需要檢查空你修剪它。 trim()的結果永遠不能爲空。

  2. 在readLine()之前,您應該首先檢查斷開連接,否則您總是會執行一次readLine()過多操作。

  3. 如果你永遠不會去你的'其他',這意味着其他條件之一永遠是真實的。

+1

@downvoters,謝謝,-2。爲什麼?請指出上述錯誤。 – EJP 2010-05-28 02:20:04

0

其他不執行似乎不太可能。你確定你的循環不會退出這樣的數據包,因此你的條件甚至不運行?你的 System.out.println(「已收到」+行);打印什麼似乎缺少else語句的數據包?

1

有許多的問題與您的代碼

  • in.readLine()。修剪() 的readLine做返回null,調用null.trim()會導致... NullPointerException異常
  • 是否有理由在您發送的每個響應中附加EOF。
  • 調用substring而不確定它至少有那麼多元素會拋出StringIndexOutOfBoundsException(如果它更短)。

您是否正在使用「P」進行測試?