socket close java_java.net.SocketException: Socket closed解决

如题,在socket编程中报错java.net.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的socket.getOutputStream()和 socket.getInputStream();

但它可能被其他IO流关闭影响而自动关闭(见2)

后来才知道 socket 只要在 io流close的情况下 自动关闭,意思就是你想边发送边接受最正确的方式就是发送和 接受的操作都做完之后 再一起关闭IO流 完美解决。

2. 我没有关基础的IO,为什么还是报了这个错?

常见于在socket中发送了对象的情况,也即使用了ObjectOutputStream,

出错原因:使用完毕的ObjectOutputStream关闭时,会导致其包装的OutputStream也自动关闭。

我的出错代码如下

try(OutputStream os = socket.getOutputStream();

InputStream is = socket.getInputStream())

{

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 = socket.getOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(os);

InputStream is = socket.getInputStream())

{

Resource resource = new Resource();

oos.writeObject(resource);

oos.flush();

os.write("exit".getBytes(StandardCharsets.UTF_8));

}

} catch (Exception e) {

e.printStackTrace();

}

初学者记录一下踩坑经验,如有错误还望路过大佬不吝赐教orz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值