IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> java.net.SocketException: Socket closed 解决方式 -> 正文阅读

[系统运维]java.net.SocketException: Socket closed 解决方式

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

// 建立连接
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 服务,在这种服务中,客户端连接服务器,发送一个请求,捕获响应信息,然后断开连接。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:28:46  更:2022-04-06 16:31:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:19:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码