java.SocketException:Socketclosed解决
java.SocketException:Socketclosed解决
预祝2021高考顺利的话如题,在socket编程中报错java.SocketException: Socket closed
1、理解错误含义
在数⼩时⽆能狂怒后于StackOverflow寻得箴⾔:
This exception means that you closed the socket, and then continued to try to use it.
你把socket关了,却还想继续⽤,就会报这个错
2、可能的原因
1. 关闭了IO流(最常见)
也就是说,在你发送、接收操作做完之前别关IO流,也许就能解决;
注意,你可能没有关闭IO流,或没有关掉socket的OutputStream()和InputStream();
但它可能被其他IO流关闭影响⽽⾃动关闭(见2)
后来才知道 socket 只要在 io流close的情况下⾃动关闭,意思就是你想边发送边接受最正确的⽅式就是发送和接受的操作都做完之后再⼀起关闭IO流完美解决。
2. 我没有关基础的IO,为什么还是报了这个错?
常见于在socket中发送了对象的情况,也即使⽤了ObjectOutputStream,
出错原因:使⽤完毕的ObjectOutputStream关闭时,会导致其包装的OutputStream也⾃动关闭。
我的出错代码如下
try(OutputStream os = OutputStream();
InputStream is = InputStream())锦鲤的饲养方法
{
Resource resource = new Resource();
sendResourceObj(resource,os);
办公室主任总结
os.write("exit".getBytes(StandardCharsets.UTF_8));爱情笑话短信
}
} catch (Exception e) {
e.printStackTrace();
}
其中的发送对象的函数如下(本意是为了解耦,把功能尽量模块化):
public static void sendResourceObj(Resource r,OutputStream os){
try(ObjectOutputStream oos = new ObjectOutputStream(os))
哪吒传奇歌词
{
oos.writeObject(r);
oos.flush();父亲节的祝福话语
} catch (Exception e) {
e.printStackTrace();
}
}
可以看到,在sendResourceObj执⾏结束后,ObjectOutputStream就关闭了;
修改⽅法:
把ObjectOutputStream和OutputStream⼀同,直接放到try-with-resource的声明语句中,待使⽤IO完毕后⼀起关闭即可
try(OutputStream os = OutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
InputStream is = InputStream())
{
Resource resource = new Resource();
oos.writeObject(resource);
oos.flush();
os.write("exit".getBytes(StandardCharsets.UTF_8));
}
} catch (Exception e) {
e.printStackTrace();
}
初学者记录⼀下踩坑经验,如有错误还望路过⼤佬不吝赐教orz

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。