Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字-在服务器断开连接时断开客户端的连接_Java_Sockets - Fatal编程技术网

Java 套接字-在服务器断开连接时断开客户端的连接

Java 套接字-在服务器断开连接时断开客户端的连接,java,sockets,Java,Sockets,我正在用Java编写一个带有套接字的聊天应用程序。我有一个方法,它被调用的次数和连接到服务器的客户端的次数一样多 在客户端,我创建了一个ClientInfo对象,如下所示 最后是ServerHandler(很抱歉粘贴了所有代码,我正在尽最大努力压缩它) 我的目标:: 当用户停止服务器时,必须断开所有客户端的连接。在remove_online_user()期间,关闭ObjectInputStream/ObjectOutputStream应在客户端服务器处理程序中触发异常。但目前情况并非

我正在用Java编写一个带有套接字的聊天应用程序。我有一个方法,它被调用的次数和连接到服务器的客户端的次数一样多





在客户端,我创建了一个
ClientInfo
对象,如下所示



最后是ServerHandler(很抱歉粘贴了所有代码,我正在尽最大努力压缩它)

我的目标::

当用户停止服务器时,必须断开所有客户端的连接。在remove_online_user()期间,关闭ObjectInputStream/ObjectOutputStream应在客户端服务器处理程序中触发异常。但目前情况并非如此。我做错了什么


(如果我没有发布足够的信息,我提前道歉;我不想用4个完整的.java文件吓唬任何人。如果需要更多信息,请告诉我)

关闭套接字将在对等方的
readObject()
方法中触发
EOFEException


出于同样的原因,您的读取循环无效
readObject()
在流的末尾不会返回null。

Hm,我知道EOFEException是IOException的一个子类,它将触发此异常。我不明白你说readObject()在流的末尾不返回null是什么意思?你能解释一下吗?我觉得这是一个非常清楚的说法。哪一部分你不明白?“在溪流的尽头”是我不明白的。它为什么不返回null?这是如何回答我的问题的?若你们知道流的末尾将触发
EOFException
为什么你们要问我为什么它不返回null?它不返回null(a)是因为它抛出了
EOFException
,而(b)是因为它没有说明在Javadoc的流结束时返回null。它可以在您编写null时返回null。这就是为什么它抛出
EOFEException
:需要带外值。您的代码和症状与这些方法的实际工作方式不一致。好的,我现在理解了这一部分。你能提供一个解决方案吗?我不知道如何触发断开连接
public class ClientInfo implements Serializable
{
    public ObjectOutputStream writer;
    public ObjectInputStream reader;
    public String user_name;

    public ClientInfo(ObjectOutputStream writer, ObjectInputStream reader, String name)
    {
        this.reader = reader;
        this.writer = writer;
        this.user_name = name;
    }
}//end class
 /*Client side code*/
  void remove_online_user(ClientInfo client_to_remove)
        {
            try
            {
                client_to_remove.reader.close(); //this should trigger server handler in client
                client_to_remove.writer.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }//end remove_online_users()
client = new ClientInfo(
                    new ObjectOutputStream(client_socket.getOutputStream()),
                    new ObjectInputStream(client_socket.getInputStream()),
                    user_name);

 new ServerHandler(client, this);
class ServerHandler implements Runnable
{
    private ClientInfo server;
    private ClientBackEnd client_back_end;


    public ServerHandler(ClientInfo server, ClientBackEnd client_back_end)
    {
        this.server = server;
        this.client_back_end = client_back_end;
    }//end constructor


    /*method invoked by start() call in constructor, manages communication between client and server*/
    public void run()
    {
        try
        {
            MessageInfo message;
            while ((message = (MessageInfo) server.reader.readObject()) != null)
            {
                if (message.clients != null)
                {
                    for (ClientInfo cd : message.clients)
                    {
                        if (client_back_end.listModel.contains(cd)) continue;
                        client_back_end.listModel.addElement(cd);
                    }

                    for (Object cd : client_back_end.listModel.toArray())
                    {
                        if (message.clients.contains(cd)) continue;
                        client_back_end.listModel.removeElement(cd);
                    }

                }
                else
                {
                   System.out.println("\n" + message.message_contents);
                }
            }
        }
        catch (ClassNotFoundException | IOException e)
        {
            //This should trigger during the execution of remove_online_user();
            client_back_end.disconnect_from_server(); 
        }
    }//end run()