栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

socket编程报异常java.io.EOFException

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027599.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号