2012-07-06 111 views
1

我正在嘗試製作一個網絡應用程序,以進行概念驗證項目。 我需要保持連接打開,加入的客戶端,但我運行的while循環永遠不會退出第一個循環。 代碼:While循環和套接字

public class comm implements Runnable { 

    private Socket socket; 
    private String line, input; 
    boolean sending = true; 
    boolean connected = false; 
    private int me; 
    private BufferedReader br; 
    private PrintWriter pw; 

    doComms(Socket server) { 
     socket = server; 
     me = Main.connected; 
    } 

    public void run() { 
     try { 
       br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       pw = new PrintWriter(socket.getOutputStream(), true); 

      while (true) { 

       System.out.println("Waiting"); 
       readCommand(); 
      } 
     } catch (Exception ex) { 
      System.out.println(ex); 
     } 
    } 

    private void readCommand() throws Exception { 

     String str; 

     while (br.readLine() != null) { 

      if (!connected) { 
       pw.println("connect"); 
      } 

      str = br.readLine(); 
      System.out.println(str); 

      if (str.startsWith("!START!")) { 
       System.out.println("User connected"); 
       connected = true; 
       String[] split = str.split("#"); 
       Main.jTable1.getModel().setValueAt(split[1], me, 2); 
       Main.jTable1.getModel().setValueAt(split[2], me, 3); 
       Main.jTable1.getModel().setValueAt("Connected...", me, 4); 
      } 

     } 
    } 
} 

開始的代碼是好的,它的作用是使一個新的線程爲每個連接的用戶,並在客戶端軟件運行正常了。我究竟做錯了什麼?

+0

你寫的while run()方法while(true),這是不正確的。 – 2012-07-06 03:47:48

+0

但是,我希望代碼循環,所以我可以在客戶端和服務器之間添加更多通信。 – user1497561 2012-07-06 03:49:18

+0

第一個循環與'true'一樣嗎? – Chan 2012-07-06 03:52:37

回答

0

但是我運行的while循環永遠不會退出第一個循環。

你指的是第一個循環是:

while(true) { ... } 

這將永遠不會退出,因爲true總是正確的。

+0

你誤解了我。 我的意思是,退出循環,再次運行代碼,它只運行一次代碼。 – user1497561 2012-07-06 04:01:56

+0

那是因爲br.readline()永遠不會返回。你已經無限地運行了套接字連接,它永遠不會關閉。編輯:哦,看起來像有人得到了答案已經(= – dcow 2012-07-06 13:53:55

3

我最好的猜測。它永遠不會失控第一readCommand通話,因爲readCommand本身是一個無限循環:

while (br.readLine() != null) { 

br.readLine將阻塞,直到從插座輸入下一行到達。因此,退出循環的唯一方法是遠程客戶端斷開連接。