2012-07-06 95 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将阻塞,直到从插座输入下一行到达。因此,退出循环的唯一方法是远程客户端断开连接。