shutdowninput是半关闭输入方向,向对端发fin表示本端不再接收数据,read()立即返回-1,但socket和输出流仍可用。

shutdownInput 并不是关闭输入流,而是向 TCP 连接对端发送一个 FIN 信号,表示“我不会再从你那边读数据了”,即**半关闭输入方向**。它不关闭 Socket 本身,也不影响输出流(仍可 send)。
shutdownInput 的真实作用
它通知本端操作系统:停止接收对方发来的数据。后续调用 InputStream.read() 会立即返回 -1(表示流已到末尾),而不是阻塞等待或抛异常。注意:这不会触发对方的 read() 返回 -1,除非对方也调用了 shutdownOutput 或 close。
典型使用场景
- 客户端发送完请求后,明确告诉服务端“请求发完了,可以开始处理并响应”,避免服务端一直等更多数据
- 实现 HTTP/1.0 中的 “request done” 语义(无 keep-alive)
- 在双工通信中,某一方单向结束接收,但仍需发响应
和 close()、shutdownOutput 的区别
close():彻底释放 Socket 资源,输入输出流都不可用,连接终止。
shutdownOutput():向对端发 FIN,表示“我不会再发数据了”,但还能收;
shutdownInput():告诉本端内核“别再把收到的数据给我了”,对端不受影响,仍可继续发(但本端 read 会返回 -1)。
代码示例(客户端主动 shutdownInput)
Socket socket = new Socket("localhost", 8080);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
out.write("GET / HTTP/1.1\r\nHost: localhost\r\n\r\n".getBytes());
out.flush();
// 告诉自己:不再接收更多请求体(虽然 HTTP 不这么用,仅示意)
socket.shutdownInput(); // ← 此时 in.read() 后续将返回 -1
int b;
while ((b = in.read()) != -1) { // 实际中这里第一次 read 就可能返回 -1
System.out.print((char) b);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











