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就关闭了;

修改方法
ObjectOutputStreamOutputStream一同,直接放到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辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 程序猿一枚,工作小半年,对Java的理解已经远超刚刚离开学校是的那一枚小白了。身边的学弟陆陆续续入坑,不过经常找我...
    黄小丶平阅读 480评论 0 0
  • TCP / IP模型中有5层结构:应用层、传输层、网络层、数据链路层以及物理层。其中IP协议是位于网络层的,TCP...
    tracy_668阅读 1,217评论 0 1
  • 第十六章 异常机制和file类 16.1 异常机制(重点) 16.1.1 基本概念 所谓的异常就是Java程序在运...
    青山常客阅读 338评论 0 0
  • 夜莺2517阅读 128,155评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 7,450评论 1 6

友情链接更多精彩内容