2015-01-06 142 views
2

我一直在聊天室工作。客户端断开连接时,服务器不会移除/断开套接字

多线程服务器接受客户

btnConnect.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      try{ 


       int port = 2345; 
       ServerSocket server = new ServerSocket(port); 
       System.out.println("Waiting for clients"); 
       Thread thread = new Thread(){ 
        public void run(){ 
         while(true){ 
          Socket socket; 
          try { 
           socket = server.accept(); 
           gui.AddUserToList(socket); 
           ConnectionArray.add(socket); 
           ChatClient chat = new ChatClient(socket,gui); 
           Thread x = new Thread(chat); 
           x.start(); 
          } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 

         } 
        } 
       }; 
       thread.start(); 
      } 
      catch(IOException error){ 
       System.out.println(error); 
      } 


     } 
    }); 

当按下连接按钮,它将运行一个无限循环,接受客户。对于它连接的每个客户端,它将其广告到名为AddUserToList的ListArray。

创建一个ChatClient,并在Thread构造函数中传递该对象。

public void isConnected(){ 
    if(!socket.isConnected()){ 

     for(int i = 1; i <= GUI.ConnectionArray.size(); i++){ 

      if(GUI.ConnectionArray.get(i) == socket){ 
       GUI.ConnectionArray.remove(i); 
       gui.updateList(); 

      } 
     } 

    } 
} 


@Override 
public void run() { 
    try 
    { 
     try 
     { 
      input = new Scanner(socket.getInputStream()); 
      out = new PrintWriter(socket.getOutputStream()); 

      while(true) 
      { 
       isConnected(); 
       if(!input.hasNext()) 
        return; 



       message = input.nextLine(); 


       for(int i = 1; i <= GUI.ConnectionArray.size(); i++){ 
        Socket tmpSocket = (Socket) GUI.ConnectionArray.get(i-1); 
        PrintWriter tmpOut = new PrintWriter(tmpSocket.getOutputStream()); 
        tmpOut.println(message); 
        tmpOut.flush(); 
        //System.out.println("Sent"); 


       }     
      } 

     } 
     finally 
     { 
      socket.close(); 
     } 
    } 
    catch(IOException io){ 
     System.out.println(io); 
    } 

} 

如果没有消息,则应检查连接。当我断开我的客户端。

  while(true) 
      { 
       isConnected(); 
       if(!input.hasNext()) 
        return; 

由于没有发送任何内容,因此该行应该返回,那么为什么程序会卡住试图收听消息?

真的没有办法关闭套接字吗?因为我需要从ArrayList中删除用户/套接字,然后更新它以显示没有客户端连接。

回答

2

您需要检查所有读取和扫描程序调用的流条件结束。你不在任何地方。 isConnected()方法不会这样做。它只告诉你曾经连接这个插座。。当对方断开连接时,它不会奇迹般地变成错误。 isClosed()在那个时候也不会神奇地成为真实。

+0

嘿,对不起,我是一个插座编程的新手。我搜索了“流条件Java”并找不到任何资源来扩展您的答案。 你是对的,我也谷歌isConnected()方法和其他人说你说的同样的事情。 我只是在“流条件”,“扫描仪调用”和“DLL”丢失。 对不起,如果我听起来很天真 – Moynul

+0

'read()'在流结束时返回-1; 'hasNext()'和'hasNextLine()'返回false; 'readLine()返回null。 – EJP

+0

非常感谢!我做了if(message == null),它工作,因为它返回false!感谢:D – Moynul

相关问题