Java BIO基本介绍
- Java BIO基本介绍
- 工作原理
- BIO传统通讯实现
- 总结
- BIO实现多发和多收
- 结果:
Java BIO基本介绍
- 📜Java BIO就是传统的java io 编程,其相关的类和接口在java.io
- 📜Blo(blockingl/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)
工作原理
🌟服务端
1、通过serversoket注册端口
2、服务端调用accpect方法用于监听客户端的socket请求
3、从socket中获取字节输入或输出流进行数据的读写操作
🌟客户端
1、通过socket对象与服务端连接
2、从socket中得到字节输入或者输出流进行读写操作
BIO传统通讯实现
服务端
//服务端
public static void main(String[] args) {
try {
//定义ServerSocket进行端口注册
ServerSocket socket = new ServerSocket(8686);
//监听客户端的Socket请求
Socket st = socket.accept();
//获取Socket请求中的字节输入流对象
InputStream is = st.getInputStream();
//把字节输入流包装成缓冲字符输入流
BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
String msg;
if ((msg = bfr.readLine())!=null){
System.out.println("服务端接收到的信息"+ msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
客户端
//客户端
public static void main(String[] args) {
try {
//创建Socket对象请求服务器连接
Socket socket = new Socket("127.0.0.1",8686);
//从Socket中获取字节流
OutputStream os = socket.getOutputStream();
//把字节输出流包装成一个打印流
PrintStream ps = new PrintStream(os);
ps.println("hello word!!! ");
ps.close();
} catch (IOException e) {
e.printStackTrace();
}
}
总结
- 🔔在以上通信中,服务端会一致等待客户端的消息,如果客户端没有进行消息的发送,服务端将一直进入阻塞状态。
- 🔔同时服务端是按照行获取消息的,这意味着客户端也必须按照行进行消息的发送,否则服务端将进入等待消息的阻塞状态!
BIO实现多发和多收
思想:通过while函数实现客户端一直发送消息往服务端,服务端一直接接收消息并输出,实现多发和多收的机制
客户端
//客户端
public static void main(String[] args) {
try {
//创建Socket对象请求服务器连接
Socket socket = new Socket("127.0.0.1",8686);
//从Socket中获取字节流
OutputStream os = socket.getOutputStream();
//把字节输出流包装成一个打印流
PrintStream ps = new PrintStream(os);
Scanner sc = new Scanner(System.in);
while (true){
System.out.print("请说");
String msg = sc.nextLine();
ps.println(msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
服务端
//服务端
public static void main(String[] args) {
try {
//定义ServerSocket进行端口注册
ServerSocket socket = new ServerSocket(8686);
//监听客户端的Socket请求
Socket st = socket.accept();
//获取Socket请求中的字节输入流对象
InputStream is = st.getInputStream();
//把字节输入流包装成缓冲字符输入流
BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = bfr.readLine())!=null){
System.out.println("服务端接收到的信息"+ msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
结果:
实现了客户端每发一条消息,服务端就即使接收并打印出来
服务端 | 客户端