BIO概念
同步阻塞I/O模式,全称BlockingIO,数据的读取写入必须阻塞在一个线程内等待其完成
它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。
它的优点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
原理图
图片来源:https://mp.weixin.qq.com/s/CRd3-vRD7xwoexqv7xyHRw
实例demo
服务端代码
/**
* bio服务端
*
* @author LionLi
*/
public class BioServer {
public static void main(String[] args) {
try {
// 创建服务端socket
ServerSocket server = new ServerSocket(8088);
System.out.println("服务端启动成功!!!");
// 堵塞
Socket socket = server.accept();
// 创建消息处理器
new ServerHandler(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端消息处理器
/**
* bio服务端消息处理
*
* @author LionLi
*/
public class ServerHandler {
public ServerHandler(Socket socket) {
try (InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true)) {
String body;
Scanner scanner = new Scanner(System.in);
while (true) {
// 读取客户端消息
body = br.readLine();
if (body == null) {
break;
}
System.out.println("客户端: " + body);
String s = scanner.nextLine();
System.out.println("服务端: " + s);
// 发送到客户端
pw.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
/**
* bio客户端
*
* @author LionLi
*/
public class BioClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8088);
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(isr);
PrintStream ps = new PrintStream(socket.getOutputStream())) {
System.out.println("请输入内容: ");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println("客户端: " + str);
// 发送到服务端
ps.println(str);
String response;
while (true) {
// 读取服务端消息
response = br.readLine();
if (response == null || response.length() == 0) {
break;
}
System.out.println("服务端: " + response);
String client = scanner.nextLine();
System.out.println("客户端: " + client);
ps.println(client);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
非常简单的一个通讯
测试
启动服务端
启动客户端
客户端发送消息给服务端
服务端回复消息
项目已上传到gitee
地址: netty-demo
如果帮到您了,请帮忙点个star