BIO的工作流程

简介: BIO(Blocking I/O)工作流程是指在进行输入输出操作时,线程会一直阻塞直到操作完成。具体流程包括:客户端发起请求,服务器接收后开始处理,期间服务器线程处于等待状态,直至数据准备完毕,响应返回给客户端,线程才继续执行其他任务。
  1. 服务器端启动监听

    • 创建ServerSocket对象:在BIO(Blocking I/O)模型的服务器端,首先需要创建一个ServerSocket对象。这个对象用于监听指定端口上的客户端连接请求。例如,在Java中可以通过ServerSocket serverSocket = new ServerSocket(portNumber);来创建一个监听特定端口(portNumber)的ServerSocket。这一步相当于在服务器上打开了一个“门”,等待客户端来“敲门”。
    • 进入阻塞状态等待连接:服务器启动后,调用ServerSocket的accept方法来等待客户端的连接。这是一个阻塞操作,意味着服务器线程会在这里暂停执行,直到有客户端连接请求到达。例如,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操作(如accept、read、write)时会被阻塞,无法同时处理其他客户端的请求。这种方式在连接数较少的情况下可以正常工作,但在高并发场景下可能会导致线程资源的大量消耗和性能下降。

相关文章
|
缓存 网络协议 Ubuntu
dpdk课程学习之练习笔记一(接收,发送,arp,icmp功能测试)
dpdk课程学习之练习笔记一(接收,发送,arp,icmp功能测试)
702 0
|
安全 前端开发 Java
Springboot中如何优雅的进行字段以及业务校验
Springboot中如何优雅的进行字段以及业务校验
717 0
|
存储 缓存 网络协议
DPDK入门(环境搭建以及小demo)
DPDK入门(环境搭建以及小demo)
2174 0
|
Linux
嵌入式linux系统设备树实例分析
嵌入式linux系统设备树实例分析
464 0
|
人工智能 编解码 算法
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
949 5
|
缓存 NoSQL 应用服务中间件
高性能软件负载OpenResty整合Reids集群配置
高性能软件负载OpenResty整合Reids集群配置
936 1
|
安全 Linux Shell
应急响应处置现场流程 - 文件痕迹排查笔记07
应急响应处置现场流程 - 文件痕迹排查笔记07
720 8
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
153094 0
|
SQL 关系型数据库 MySQL
MySQL操作利器大公开!这几款客户端让你事半功倍
本文介绍了多种MySQL数据库管理工具,包括命令行工具、图形化用户界面(GUI)工具和Web界面工具。主要工具有: 1. **Navicat for MySQL**:功能强大,支持多种数据库管理任务,但需付费。 2. **DBeaver**:开源免费,支持多种数据库,安装包较大。 3. **MySQL Workbench**:官方提供的图形化工具,适合MySQL全家桶用户。 4. **HeidiSQL**:轻量级Windows客户端,简单易用。 5. **phpMyAdmin**:基于Web的管理工具,易于部署和使用。 6. **SQLyog**:适用于Windows,功能丰富,有免费
3124 3
|
算法 SDN C++
以太网帧FCS校验:CRC32的三种实现
这篇文章讨论了CRC32校验码的三种实现方法,用于检测网络通信中的数据错误。首先介绍了基础的按位计算方法,虽然直观但效率低。接着,文章提出了使用非翻转查找表和翻转查找表的快速计算方法,后者在性能上更优。文中提供了C++代码示例,展示如何生成和使用这些查找表。最后,指出在实际应用中,应根据性能需求选择合适的方法。