socket编程报异常java.io.EOFException

本文讲述了如何通过在服务器端发送消息通知来避免客户端退出时出现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值