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