java网络编程(Socket)BufferedInputStream/BufferedOutputStream包装流引发的SocketException: Socket closed

问题描述:使用Socket网络编程,使用BufferedInputStream/BufferedOutputStream包装流进行文件发送与接受能够正常启动服务端与客户端,服务端端也能正常接受到客户端发送过来的图片,但服务端在返回信息时爆出了异常:Exception in thread "main" java.net.SocketException: Socket closed,经过漫长的bug之旅终于找到解决方案,就是在发送完之后使用包装流的flush方法刷新了一下即可,这个bug产生的原因是:你在Socket关闭之后仍然尝试发送文件,归根结底就是这个BufferedOutputStream类在半关闭(Socket.shutdownOutput())之前没有将文件发送出去。

这是错误代码,我将刷新方法注释掉了,仅仅使用Socket.shutdownOutput()方法无法将内容发送出去还需要配合刷新:outputStream1.flush();其他类也需要使用刷新将内容给发送出去

        BufferedOutputStream outputStream1 = new BufferedOutputStream(socket.getOutputStream());
        outputStream1.write("你好".getBytes(StandardCharsets.UTF_8));
//        outputStream1.flush();
        socket.shutdownOutput();//结束标志

如果你还想了深入解一下退推荐你看一下这两篇文章:socket中如何正确使用BufferedOutputStream,BufferedInputStream

BufferedInputStream/BufferedOutputStream包装流关闭引发的异常

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值