2012-06-17 92 views
1

我得到了一個讀寫網絡套接字的線程。線程突然停止,沒有例外或錯誤消息

public void run() { 
    try { 
     Socket socket = new Socket("10.0.1.11", 19456); 
     out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     String message = "13" + seperator + "0" + seperator + "userdata"; 
     out.write(message); 
     out.flush(); 

     while (listen) { 
      String input = ""; 

      for (int letter = in.read(); letter != -1; letter = in.read()) { 
       System.out.println((char)letter); 
       input += (char)letter; 
      } 

      System.out.println(input); 
      displayText(input); 
     } 

     socket.close(); 
    } catch (UnknownHostException e) { 
     displayText("Could not connect to server!"); 
    } catch (IOException e) { 
     displayText("Could not open IO to server!"); 
    } 
} 

但是,for循環後的所有內容都沒有執行。 for循環中的System.out.println打印出它應該的所有字母,但for循環後面的System.out.println和displayText函數從不執行(用斷點檢查)...我錯過了什麼這裏? :S

+4

in.read()blocking? – ssteinberg

回答

3

根據http://www.docjar.com/docs/api/java/io/Reader.html#read

This method will block until a character is available, 
an I/O error occurs, or the end of the stream is reached. 

他們的代碼示例並顯示它們返回-1上EOF。

因此,您的for循環被阻止,因爲in.read()不能識別EOF條件。

直到套接字服務器關閉它的發送方向,關閉客戶端的接收部分,它才能做到這一點。

0
  1. 在調試器
  2. 啓動程序重現錯誤
  3. 檢查線程是否仍然存在(在eclipse,調試視圖列出所有的進程,其中的線程)
    • 如果線程存在:掛起它(在eclipse中,點擊線程並按下暫停圖標)。調試器現在將顯示該線程的堆棧,以便您可以檢查它正在執行的操作。
    • 如果線程不再存在,它必須正常或突然終止(由於未處理的異常)。你可以通過在run()中的最後一個語句上設置一個斷點來區分這一點。如果它突然完成,則該線程的未捕獲異常處理程序必須已被調用。