网站首页 > 技术文章 正文
BIO是什么?
BIO是Java中的一种I/O模型,全称为Blocking I/O(阻塞 I/O)。在使用阻塞I/O进行数据读写时,线程会阻塞直到数据准备就绪。当线程调用输入操作时,如果没有数据可用,线程将被阻塞,直到有数据可读取。同样地,当线程调用输出操作时,如果输出缓冲区已满,线程将被阻塞,直到有足够的空间来写入数据。
BIO适用于一些简单的应用场景,特别是在如下的一些场景中。
- 并发量低:当一个程序需要的处理链接数较小,并且每个连接处理时间较短的情况下,BIO的方案相对来说比较简单可靠。
- 服务端应用相对简单:对于一些比较小的服务端应用,使用BIO可以保证程序有足够的性能来支持访问。
- 可移植:在一些开发环境中,对于一些高级的IO不支持的情况下,操作相对简单,可以使用BIO来支持,保证平台的移植性。
Java中如何实现BIO?
以下是一个简单的Java代码示例,实现了基于阻塞 I/O(Blocking I/O)的网络编程,使用 BIO(Blocking I/O)模式建立一个简单的服务器和客户端通信。在这个示例中,服务器将接收来自客户端的消息并将其打印出来。
服务器端代码
public class Server {
public static void main(String[] args) {
final int PORT = 8080;
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("Server is running and listening on port " + PORT);
while (true) {
Socket clientSocket = serverSocket.accept(); // 阻塞等待客户端连接
System.out.println("Client connected: " + clientSocket);
// 从客户端读取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = reader.readLine();
System.out.println("Message from client: " + message);
// 向客户端发送响应
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
writer.println("Server received your message: " + message);
// 关闭连接
clientSocket.close();
System.out.println("Client disconnected: " + clientSocket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
public class Client {
public static void main(String[] args) {
final String SERVER_ADDRESS = "localhost";
final int SERVER_PORT = 8080;
try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in))) {
System.out.println("Connected to server.");
// 从控制台读取输入
System.out.print("Enter message to send to server: ");
String message = consoleReader.readLine();
// 发送消息给服务器
writer.println(message);
// 从服务器接收响应
String response = reader.readLine();
System.out.println("Response from server: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,服务器会一直监听指定的端口(8080),并在有新的客户端连接时接受消息,然后将收到的消息发送回客户端。客户端会连接到服务器,并向服务器发送一条消息,然后接收服务器的响应。
总结
在BIO模型中,每个I/O操作(读取或写入)都会导致线程阻塞,直到操作完成。这意味着,如果有大量的连接或者需要处理大量的并发I/O操作,就需要使用大量的线程来管理这些连接,这样会导致系统资源的浪费和性能下降。
尽管阻塞I/O简单易用,但在高并发的情况下效率较低,因为它会导致大量的线程阻塞等待I/O操作完成。因此,对于需要处理大量并发连接的场景,通常会选择非阻塞I/O模型,如 NIO(New I/O)或 AIO(Asynchronous I/O)来提高系统的性能和吞吐量。
- 上一篇: 夫妻吵个架 老婆竟然心梗了!医生提醒
- 下一篇: 非梗阻性冠心病 非梗阻性冠心病冠状动脉扩张严重吗
猜你喜欢
- 2024-10-25 什么是喉梗阻 反流性食管炎嗓子疼怎么办
- 2024-10-25 阻塞列队详解!让你轻松理解阻塞列队
- 2024-10-25 【健康科普】认识阻塞性睡眠呼吸暂停低通气综合征
- 2024-10-25 气象科普|阻塞高压为何方神圣?后期它将给我国制造多轮冷空气
- 2024-10-25 非阻塞算法CAS 非阻塞函数
- 2024-10-25 为什么网络 I/O 会被阻塞?I/O 到底是什么?
- 2024-10-25 如何用Java设计阻塞队列,再说说ArrayBlocking和LinkedBlocking
- 2024-10-25 使用 Python Socket 实现非阻塞 I/O入门讲解
- 2024-10-25 梗阻性无精子症:多种选择,何为最佳?
- 2024-10-25 焦耳小偷 一个神奇的电路 焦耳小偷电路需要注意的地方
你 发表评论:
欢迎- 最近发表
-
- 吴谨言专访大反转!痛批耍大牌后竟翻红,六公主七连发力显真诚
- 港股2月28日物业股涨幅榜:CHINAOVSPPT涨1.72%位居首位
- 港股2月28日物业股午盘:CHINAOVSPPT涨1.72%位居首位
- 港股3月2日物业股涨幅榜:CHINAOVSPPT涨1.03%位居首位
- 港股3月2日物业股午盘:CHINAOVSPPT涨1.03%
- 天赋与心痛的背后:邓鸣贺成长悲剧引发的深刻反思
- 冯小刚女儿徐朵追星范丞丞 同框合照曝光惹人羡,回应网友尽显亲民
- “资本大佬”王冉:51岁娶小17岁童瑶,并承诺余生为娇妻保驾护航
- 港股3月2日物业股午盘:CHINAOVSPPT涨1.03%位居首位
- 「IT之家开箱」vivo S15 图赏:双镜云窗,盛夏风光
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)