客户端断开连接时,服务器不会删除/断开套接字

时间:2015-01-06 11:20:04

标签: java multithreading sockets tcp

我一直在聊天室工作。

Multi Threaded Server接受客户端

    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中删除用户/套接字,然后更新它以显示没有连接客户端。

1 个答案:

答案 0 :(得分:2)

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

相关问题