【问题标题】:Server does not remove/disconnect socket when Client disconnects当客户端断开连接时,服务器不会删除/断开套接字
【发布时间】:2015-01-06 11:20:04
【问题描述】:

我一直在开发聊天室。

多线程服务器接受客户端

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

【问题讨论】:

    标签: java multithreading sockets tcp


    【解决方案1】:

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

    【讨论】:

    • 嘿抱歉,我是套接字编程的新手。我搜索了“流条件 Java”,找不到任何资源来扩展您的答案。你是对的,我也用谷歌搜索了 isConnected() 方法,其他人也说过你说的同样的话。我只是迷失在“流条件”、“扫描器调用”和“DLL”中。对不起,如果我听起来很幼稚
    • read() 在流结束时返回 -1; hasNext()hasNextLine() 返回 false; `readLine() 返回 null。
    • 非常感谢!我已经完成了 if(message == null) 并且它有效,因为它返回 false!谢谢:D
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多