2015-11-18 45 views
0

我在写一个简单的多线程聊天服务器。每个客户端在连接时创建新线程多线程服务器 - 如何正确处理客户端和服务器断开连接

Thread listenThread = new Thread(() -> { 
     while (true) { 
      try { 
       Socket client = serverSocket.accept(); 
       ClientThread handler = new ClientThread(this, client); 
       clients.add(handler); 
       handler.start(); 
      } catch (SocketException e) { 
       if (e.getMessage().contains("socket closed")) 
        break; 

       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

此方法适用于检查客户端是否关闭连接。

class ClientThread extends Thread { 
    @Override 
    public void run() { 
     while(running) { 
      int read = inputStream.read(); 
      if(read > 0) { 
       // read 
      } 
      else if(read < 0) 
       running = false;   
     } 
    } 
}; 

的问题是,当我想停止服务器,我不能放弃线程,因为inputStream.read()块执行,以便设置running变量设置为false不起作用。如何使它工作?

回答

-1
class ClientThread extends Thread { 
    @Override 
    public void run() { 
     String input; 
     while(running) { 
      input = inputStream.read(); 
      if(input.lengt > 0) { 
       if(input.equals("shutdowncode")) 
        break; 
      }  
     } 
    } 
}; 

从服务器发送关机代码,告诉客户端断开连接

+0

只要在服务端关闭套接字就可以完成相同的事情。然而,他的问题在于,这些线程在'read()'中被阻塞,因此无法让他们执行任何操作。 – EJP

0
  • 如果您希望服务器立即退出,使客户线程守护线程的客户端。
  • 如果您希望客户端线程干净地关闭其套接字,请在接受套接字上设置较短的读取超时,并让它们在每次超时时检查您的标志。
相关问题