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流 完美解决。
内容来自博客:https://blog.csdn.net/qq_33431368/article/details/72331128
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
更多精彩内容,关注我们▼▼

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~