当客户端断开连接时,服务器不会 remove/disconnect 套接字

Server does not remove/disconnect socket when Client disconnects

我一直在开发聊天室。

多线程服务器接受客户端

    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);
            }


        }
    });

按下连接按钮后,它将run 无限循环以接受客户端。对于它连接的每个客户端,它会将其广告到名为 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 中删除 user/socket 然后更新它以显示没有客户端连接。

您需要检查所有读取和扫描程序调用的流结束条件。你没有在任何地方这样做。 isConnected() 方法不会那样做。它只告诉你 是否连接过 这个套接字。。当对等方断开连接时,它不会神奇地变为假。 isClosed() 也没有在那个时候神奇地成为现实。