socket编程报异常java.io.EOFException

问题描述

当客户端正常退出时,发现服务器那边正常工作,但是客户端会最后报一个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,服务器,jvm)