BIO的工作流程

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: BIO(Blocking I/O)工作流程是指在进行输入输出操作时,线程会一直阻塞直到操作完成。具体流程包括:客户端发起请求,服务器接收后开始处理,期间服务器线程处于等待状态,直至数据准备完毕,响应返回给客户端,线程才继续执行其他任务。
  1. 服务器端启动监听

    • 创建ServerSocket对象:在BIO(Blocking I/O)模型的服务器端,首先需要创建一个ServerSocket对象。这个对象用于监听指定端口上的客户端连接请求。例如,在Java中可以通过ServerSocket serverSocket = new ServerSocket(portNumber);来创建一个监听特定端口(portNumber)的ServerSocket。这一步相当于在服务器上打开了一个“门”,等待客户端来“敲门”。
    • 进入阻塞状态等待连接:服务器启动后,调用ServerSocketaccept方法来等待客户端的连接。这是一个阻塞操作,意味着服务器线程会在这里暂停执行,直到有客户端连接请求到达。例如,Socket socket = serverSocket.accept();这行代码会使服务器线程进入阻塞状态,直到有一个新的客户端成功连接到服务器。
  2. 客户端连接建立

    • 客户端发起连接请求:在客户端,需要创建一个Socket对象并指定服务器的IP地址和端口号来发起连接请求。例如,在Java中可以使用Socket clientSocket = new Socket(serverIP, serverPort);来建立与服务器的连接。当客户端执行这个操作时,它会向服务器发送一个连接请求。
    • 服务器接受连接并返回Socket对象:当服务器的accept方法检测到客户端的连接请求后,它会接受这个请求,并返回一个与该客户端通信的Socket对象。这个Socket对象代表了服务器和客户端之间的通信通道,双方可以通过这个通道进行数据传输。
  3. 数据传输阶段

    • 获取输入输出流:在服务器端和客户端都可以通过Socket对象获取对应的输入流(InputStream)和输出流(OutputStream)。例如,在服务器端可以使用InputStream inputStream = socket.getInputStream();来获取从客户端读取数据的输入流,使用OutputStream outputStream = socket.getOutputStream();来获取向客户端发送数据的输出流。
    • 数据读写操作(阻塞过程)
      • 读数据:当服务器从输入流读取客户端发送的数据时,调用read方法会导致线程阻塞。例如,byte[] buffer = new byte[1024]; int length = inputStream.read(buffer);这行代码会使服务器线程阻塞,直到客户端发送了足够的数据(最多读取buffer长度的数据)或者客户端关闭了连接。读取到的数据存储在buffer数组中,length表示实际读取到的字节数。
      • 写数据:当服务器向客户端发送数据时,通过输出流的write方法。例如,String message = "Hello, client!"; outputStream.write(message.getBytes());,这个操作会将字符串转换为字节数组并发送给客户端。如果网络或客户端接收缓冲区等原因导致数据不能立即发送出去,write操作也可能会阻塞,直到数据成功发送或者出现异常。
  4. 连接关闭阶段

    • 客户端或服务器主动关闭连接:当数据传输完成后,客户端或服务器可以主动关闭连接。在服务器端可以使用socket.close();来关闭与客户端的连接,在客户端也可以使用相同的方式关闭连接。关闭连接后,相关的资源(如套接字、输入输出流等)会被释放。
    • 清理资源:除了关闭Socket对象外,服务器端还需要关闭ServerSocket对象来释放监听端口等资源。例如,serverSocket.close();,这一步通常在服务器程序结束或者不再需要监听该端口时执行,以确保系统资源的合理利用。

BIO的整个工作流程是一种简单直接的同步阻塞式的通信方式。在这个过程中,每个客户端连接通常需要一个单独的线程来处理,因为线程在进行I/O操作(如acceptreadwrite)时会被阻塞,无法同时处理其他客户端的请求。这种方式在连接数较少的情况下可以正常工作,但在高并发场景下可能会导致线程资源的大量消耗和性能下降。

目录
打赏
0
5
5
0
219
分享
相关文章
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
掌握 CSS 弹性布局(Flexbox):构建复杂页面布局的高效秘籍与实战案例
CSS弹性布局(Flexbox)是现代网页设计中构建复杂页面布局的高效工具。本文将深入浅出地介绍Flexbox的核心概念、使用技巧及实际应用案例,帮助读者快速掌握这一强大布局方法。
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
1029 25
浏览器渲染过程中如何处理异步任务
在浏览器渲染过程中,异步任务通过事件循环机制处理。JS执行时,同步任务在主线程上执行,形成一个执行栈。异步任务则被推入任务队列中,待主线程空闲时按顺序调用,确保页面流畅渲染与响应。
如何保证 hashCode()方法的唯一性
在Java中,`hashCode()` 方法用于生成对象的哈希码,是实现数据结构如哈希表的基础。虽然完全保证 `hashCode()` 的唯一性几乎不可能,但通过合理设计,如结合对象的关键属性,可以极大减少哈希冲突,提高程序效率和稳定性。
193 9
1月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
2925 68
1月更文特别场——寻找用云高手,分享云&AI实践
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
3687 101
小白学网络系列之---从物理网络到云网络
本文由阿里云技术服务部枫桥撰写,围绕物理网络和云网络的基础知识展开,强调网络在云计算中的重要性。文章首先介绍了OSI模型下的物理层、数据链路层、网络层、传输层和应用层,解释了各层的功能与作用。接着探讨了云网络的必要性及其核心技术,如VPC(虚拟私有网络)、Overlay和Underlay网络,并阐述了它们之间的协作关系。最后,文章分析了AI大模型浪潮下云网络的演进方向,包括高速RDMA网络架构、高性能集合通信库ACCL和高性能数据主动加载加速软件KSpeed等技术的应用,展示了云网络在支持大规模分布式AI训练中的关键作用。通过本文,读者可以深入了解从物理网络到云网络的技术演进及其未来发展趋势。
292 15
【上云基础系列-02】企业推荐!必学必会的上云标准架构(弹性架构)
本文介绍上云标准弹性架构,针对企业业务发展需求,推荐使用多服务器的弹性架构而非单体架构。方案包含负载均衡、NAT网关、云服务器ECS、云数据库RDS等组件,确保业务的负载分担、冗余备份及平滑扩展。通过统一公网暴露面管理和VPC网络设计,保障架构的稳定性、安全性和可扩展性。该架构适用于中小企业上云,避免性能瓶颈和迭代升级困难,支持业务持续发展。更多内容可参考下方演进说明总览。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问