java.net.SocketException: Socket closed 解决方式

2023-11-05

问题背景:客户端连接服务器,发送一个请求,捕获响应信息。

// 建立连接
Socket socket = new Socket();
socket.connect(new InetSocketAddress(InetAddress.getLocalHost(),9999),10000);

// 将输入、输出流包装成数据输入、输出流
DataInputStream dis2 = new DataInputStream(socket.getInputStream());
DataOutputStream dos2 = new DataOutputStream(socket.getOutputStream());

// 写入数据
GetCommand get2 = new GetCommand("zhangsan", "");
dos2.writeUTF("GET");
dos2.write(SerializeUtil.serialize(get2));

dos2.close();

// 接受响应
GetCommand deserialize2 = SerializeUtil.deserialize(dis2.readAllBytes(), GetCommand.class);
System.out.println(deserialize2);

// 关闭流 和 socket
dis2.close();
socket.close();

客户端通过输出流向服务器发送数据, 如果不关闭输出流,服务器无法判断出客户端是否已经输出完毕,因此服务器的读操作将会处于阻塞状态。

当客户端关闭输出流,服务器得到客户端的输出已经结束的信息,服务器开始执行读操作。

然而,这会导致另外一个问题,客户端输出流关闭的时候,socket 也会自动断开连接。当服务器需要通过输出流向客户端传输数据时,便会出现如同标题的异常。

解决方案:使用 半关闭。

// dos2.close(); // 会导致 socket 连接断开

socket.shutdownOutput();
// 现在 socket 是半关闭状态,输出流关闭,但输入流打开,socket 连接不会断开。

以下内容摘自《Java 核心技术卷2》第三章

2.2 半关闭

套接字连接的一端可以终止其输出,同时仍旧可以接受来自另一端的数据。

这是一种很典型的情况,例如我们在向服务器传输数据,但并不知道要传输多少个数据。如果关闭一个套接字,那么服务器的连接将立刻断开,因而也就无法读取服务器的响应了。

使用半关闭的方法就可以解决上述的问题,可以通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束,但是必须保持输入流处于打开状态。

socket.shutdownOutput();
socket.shutdownInput();

当然,该协议只适用于一站式的服务,例如 HTTP 服务,在这种服务中,客户端连接服务器,发送一个请求,捕获响应信息,然后断开连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.net.SocketException: Socket closed 解决方式 的相关文章

随机推荐

  • 深度学习优化学习方法(一阶、二阶)

    深度学习优化学习方法总结 一阶为主 https blog csdn net sunflower sara article details 81321886 常用的优化算法 梯度下降法 牛顿法 拟牛顿法 共轭梯度法 二阶为主 https bl
  • Block底层原理读书笔记-《高级编程- iOS与OS多线程和内存管理》(更新中)

    1 一个Block 真正的底层都有些什么 Block会被解析成一个结构体 这里成为Block结构体 这个结构体里有 1 isa指针 说明Block的本质是一个对象 指向Stack 堆 2 有函数指针 这个函数指针指向一个函数体 该函数体的内
  • C# 企业微信接口发送消息出现错误代码60020解决方案,希望能给大家带来帮助。

    这是企业微信接口发送消息调用的代码源地址 https blog csdn net wanglui1990 article details 79744407 代码运行起来是没有问题的 但唯一出现的问题就是错误代码60020 点击企业微信 应用
  • 数据结构——单链表OJ题(第二弹)

    单链表OJ题 前言 一 返回链表开始入环的第一个节点 思路一 思路二 二 返回链表的深度拷贝 总结 前言 此次练习题有两道 有点小难度 但相信难不住大家的 我也会给出两道OJ题的链接 大家也赶快去试一试吧 一 返回链表开始入环的第一个节点
  • vue2.x与vue3.x中自定义指令详解

    目录 前言 一 自定义指令分类 二 Vue2 x自定义指令钩子函数 1 bind与update区别 2 update与componentUpdated区别 3 钩子函数的参数 4 局部自定义指令 5 全局自定义指令 6 简写形式 三 Vue
  • springboot下配置mybatis的call-setters-on-nulls属性

    使用Mybatis时 如果查询语句中某些字段值是null的 则这个字段就无法返回 对于后台数据处理来说 这是一个致命的问题 于是通过修改Mybatis的配置来解决这个问题 在springmvc下 在mybatis的配置文件里面增加以下配置即
  • C++ opencv处理kinect红外数据和彩色数据

    kinect好像已是明日黄花 但现在需要用这个做交互的人还不少 要做手势识别 于是入手一枚二手kinect2 0 入坑玩玩 做手势识别 直觉上要用opencv 从网上搜的资料来看 大多是通过openNi来操作kinect 而且要openNi
  • grpc-go源码剖析三十五之滑动窗口基本介绍以及整体流程图介绍?

    已发表的技术专栏 0 grpc go protobuf multus cni 技术专栏 总入口 1 grpc go 源码剖析与实战 文章目录 2 Protobuf介绍与实战 图文专栏 文章目录 3 multus cni 文章目录 k8s多网
  • 使用aircrack-ng套件破解wifi密码

    一 准备工作 1 需要有一个无线网卡 需要支持monitor模式 2 Kali系统 自行单独安装套件也可以 3 一个完善的密码字典 二 监听工作 首先将无线网卡连接到kali iwconfig 查看是否连接成功 airmon ng 可以查看
  • Vim 小技巧:自动写入文件头

    Vim 小技巧 情景一 自动写入文件头 在编写 C 程序时 总有一些东西会在每个头文件中出现 比如 ifndef lt File Name MACRO gt define lt File Name MACRO gt endif lt Fil
  • STM32H7 LwIP 主RAM选择 DTCM AXIRAM UDP 收发问题

    STM32H7 LwIP 主RAM选择 DTCM AXIRAM UDP 这段时间一直在调试STM32H743 期间掉进了不少坑 最大的坑还是网络这一块 例如LwIP移植 已经有前人踩过的坑 我以为我能避免 结果自己还是踩了 耽误了不少时间
  • Android --- 控件属性的属性值为 @null

    1 控件属性值为 null 1 RadioButton里面的属性android button null 是去掉前面的圆点 2 android background null 是控件自带的背景设为空
  • 《深入浅出数据分析》第九章——R语言

    文章目录 记录第一次接触R语言 一 R语言下载安装 二 运行 三 补充 1 加载csv文件 2 hist函数 记录第一次接触R语言 深入浅出数据分析 第九章讲到R语言 在这记录一下 就当给自己做的笔记 一 R语言下载安装 安装地址 http
  • mybatis是如何集成到spring的之托管mapper接口

    前言 mybatis集成到spring可以参考spring mvc集成mybatis进行数据库访问 其中mybatis集成到spring最重要的两个配置分别是SqlSessionFactoryBean和MapperScannerConfig
  • C++学习(七十四)有关三维压缩库draco

    一 是什么 Draco是谷歌Chrome 媒体团队在2017年1月发布的一个3D图形开源压缩库 提供了多种算法进行压缩和解压缩 旨在大幅加速 3D 数据的编码 传输和解码 因为研发团队的 Chrome 背景 这个开源算法的首要应用对象是浏览
  • 【编译原理】Java手写一个词法分析器

    在编程的世界中 每一个code都是一个符号 我们程序员用这些符号来表达出模型 1 1 2 上面的代码中1就是一个符号 它对应的模型是数量 比如一根手指 一根棒棒糖 当我们看到这个像小旗子的符号之后 我们就知道它对应着一根手指 此时你就相当于
  • Vue3 中引入wangeditor富文本编辑器

    文章目录 前言 一 引入 二 呈现到页面 1 原型 2 可视化界面 3 获取内容 4 配置工具栏 总结 前言 我花一些时间做了一个博客 需要一个引入编辑器 让我好在网页上就能编辑文章 这里中没有配置图片的上传功能 如有需要请自行配置 一 引
  • 远程网络读取服务器文件是否存在,linux 读取远程服务器文件是否存在

    linux 读取远程服务器文件是否存在 内容精选 换一换 云服务器网络异常 防火墙未放行本地远程桌面端口 云服务器CPU负载过高等问题均可能导致云服务器无法正常登录 本节操作介绍无法登录Windows弹性云服务器的排查思路 当您的云服务器无
  • 【Python】基于wxauto的超简单微信机器人

    前言 我是一个python初学者 一直想做一个微信版类似qq的群助手 我尝试去百度过 python微信机器人 之类的搜索 但得到的结果几乎都是使用 itchat wxpy 之类的库通过网页版微信去实现行为的 但腾讯在2019年7月份开始 彻
  • java.net.SocketException: Socket closed 解决方式

    问题背景 客户端连接服务器 发送一个请求 捕获响应信息 建立连接 Socket socket new Socket socket connect new InetSocketAddress InetAddress getLocalHost