问题描述
当客户端正常退出时,发现服务器那边正常工作,但是客户端会最后报一个java.io.EOFException异常。经排查,发现逻辑没有问题,java.io.EOFException说明是正常退出,但是为消除这个问题,需要在服务器端在退出后发送一个message告知客户端,这样就保证了没有java.io.EOFException异常
异常位置
客户端的ObjectInputStream ois = new ObjectInputStream(inputStream);出错
原因是当服务器端关闭socket对象后,得到的节点流是空的
try {
System.out.println("客户端线程,等待从服务器端读取发送的消息");
InputStream inputStream = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(inputStream);//反序列化出错!
......
原先的代码
原本的服务器端代码
else if (message.getMesType().equals(MessageType.MESSAGE_CLIENT_EXIT)) {
System.out.println(message.getSender() + " 要退出了");
//将客户端对应线程移除
MangeClientThread.removeServiceConnectClientThread(message.getSender());
socket.close();//关闭连接
break;//退出线程
}
修改后的服务器端代码
else if (message.getMesType().equals(MessageType.MESSAGE_CLIENT_EXIT)) {
System.out.println(message.getSender() + " 要退出了");
//发送一个message告知客户端。服务器要移除了
ObjectOutputStream oos = new ObjectOutputStream(MangeClientThread.getServiceConnectClientThread(message.getSender()).getSocket().getOutputStream());
Message message1 = new Message();
message1.setMesType(MessageType.MESSAGE_SERVER_EXIT);
oos.writeObject(message1);
//将客户端对应线程移除
MangeClientThread.removeServiceConnectClientThread(message.getSender());
socket.close();//关闭连接
break;//退出线程
}
这样就保证了当我用通知方式告诉客户端线程停掉时,当代码走到上面报错的位置依然有数据,从而解决了bug
本文讲述了如何通过在服务器端发送消息通知来避免客户端退出时出现java.io.EOFException。通过修改服务器代码,确保客户端接收到服务器关闭的信号,从而修复了这一问题。
3077

被折叠的 条评论
为什么被折叠?



