0

0

什么是Java中的BIO(阻塞IO)_ServerSocket与Socket的传统网络通信模型

P粉602998670

P粉602998670

发布时间:2026-03-10 08:55:02

|

735人浏览过

|

来源于php中文网

原创

serversocket.accept()卡住且一个连接占一个线程,是因为bio模型中accept()和read()默认阻塞,需为每个连接单独启线程;setsotimeout()仅实现限时阻塞,不解决线程模型缺陷;高并发应选nio。

什么是java中的bio(阻塞io)_serversocket与socket的传统网络通信模型

为什么 ServerSocket.accept() 会卡住,且一个连接就占一个线程?

因为这是 BIO 的本质:每个客户端连接都必须由一个独立线程调用 socket.getInputStream().read()serverSocket.accept(),而这两个操作默认都是阻塞的。线程在没数据可读、没新连接来时,就停在那不动,CPU 不会轮询,也不让出执行权。

常见错误现象:accept() 长时间不返回;加了 100 个客户端后服务直接 OOM(堆外内存或线程数超限);read() 在客户端断连但未发 FIN 时无限等待。

  • 必须手动为每个 Socket 启一个线程,否则后续连接无法被接收
  • ServerSocket 构造时传入的 backlog 参数(如 new ServerSocket(8080, 50))只控制内核等待队列长度,不是最大连接数
  • 没有超时机制的话,read() 可能永远等下去——哪怕客户端已拔网线
  • Java 早期(JDK 1.4 前)没 NIO,BIO 是唯一选择;现在纯用它写高并发服务,基本等于给自己挖坑

setSoTimeout() 能解决阻塞问题吗?

能,但只解一半:它让 read()accept() 从“永久阻塞”变成“限时阻塞”,抛出 SocketTimeoutException 而不是卡死。但它不改变“一个连接一个线程”的模型,也无法避免线程创建开销和上下文切换成本。

使用场景:内部低频管理端口(如健康检查接口)、调试工具、教学演示——对吞吐和连接数没要求时可用。

立即学习Java免费学习笔记(深入)”;

ChatMind
ChatMind

ChatMind是一款AI生成思维导图的效率工具,可以通过AI对话生成和编辑思维导图。

下载
  • serverSocket.setSoTimeout(5000)accept() 生效,超时后抛 SocketTimeoutException
  • socket.setSoTimeout(10000) 对后续所有 inputStream.read() 生效,每次读超过 10 秒就中断
  • 注意:超时重试逻辑得自己写,read() 返回 -1 表示流结束,返回 0 不代表没数据,可能是缓冲区空,得继续读
  • Windows 下 setSoTimeout()accept() 支持不稳定,某些 JDK 版本会忽略

BIO 模型下,怎么判断客户端是不是真断开了?

不能只靠 read() 返回 -1。TCP 连接关闭有四次挥手,但网络异常(如客户端崩溃、NAT 超时、防火墙静默丢包)会导致连接处于半开状态:服务端还认为连着,但客户端早已失联。

真实表现:read() 一直阻塞或返回 0;write() 突然抛 IOException: Broken pipe;心跳包无响应但 isConnected() 仍返回 true

  • socket.isClosed()socket.isConnected() 都是本地状态标记,不发起网络探测,不可信
  • 唯一可靠方式是开启 TCP keepalive:socket.setKeepAlive(true),但 OS 层默认探测间隔长(Linux 通常 2 小时),业务等不起
  • 更实用的是应用层心跳:固定间隔发小包(如 "PING"),对方回 "PONG",连续几次无响应就主动 close()
  • 别在 read() 阻塞时等心跳——得用单独线程或 Selector 配合,BIO 本身不支持多路复用

什么时候还值得用 BIO?

当连接数稳定、低频、生命周期长,且你明确不需要横向扩展时。比如公司内网的配置下发服务,每天就几十次请求,运维人员手动 telnet 调试,代码越直白越好维护。

但只要出现以下任一情况,就该换方案:maxThreads > 200、需要支撑移动端长连接、部署在容器里受内存限制、要对接 Prometheus 做连接数监控。

  • Spring Boot 默认内嵌 Tomcat,其 protocol="HTTP/1.1" 在低版本中就是 BIO,高并发下容易线程耗尽,需显式切到 org.apache.coyote.http11.Http11NioProtocol
  • Netty、Undertow、Jetty 的 NIO 实现,底层都绕过了 ServerSocket.accept() 的线性阻塞,这才是现代 Java 网络服务的起点
  • BIO 不是“过时技术”,而是“特定约束下的合理选择”——问题不在它本身,而在人忘了问:我的连接规模、延迟容忍、运维能力,真的匹配这个模型吗?

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

158

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

244

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 80万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号