BIO,是一种I/O模型,并不是一种java中的数据IO流,它是一种用于数据传输接受的通信模式,java支持3种通信I/O模型:BIO、NIO、AIO,不同的业务场景,使用不同的模型,可以使通信的性能,效率都有很大的提升。
简介
BIO是一种传统的通信模式:同步阻塞式。简单来说就是一个连接对应一个线程,即:有多少个客户端连接,服务端就有多少个线程,因为当一个客户端连接时,服务端需要开启一个线程来处理,但是,如果连接不做任何事情,就会造成不必要的服务开销,但是,也可以通过其他操作,改善这样的问题,比如:BIO使用线程池实现伪异步。
通信模式
其通行模式图如下:
工作机制
BIO的工作机制图如下:
服务端ServerSocket负责绑定IP地址,启动监听端口;客户端Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。 基于BIO模式下的通信,客户端 - 服务端是完全同步,完全耦合的。
实现消息单发
BIO模式下的简单通信:
public class Server {
public static void main(String[] args) throws Exception{
System.out.println("服务端启动......");
//1,注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//2,暂停等待接受客户端的连接,得到一个端到端的Socket管道
Socket socket = serverSocket.accept();
//3,从管道中获取到一个字节输入流。
InputStream inputStream = socket.getInputStream();
//4,把字节输入流包装成自己需要的流u,进行数据的读取。
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//5,读取数据
String line;
//这里会一直等待客户端的数据流过来,如果客户端掉线了,这里会报重连失败异常
while ((line = reader.readLine()) != null){
System.out.println("服务端收到信息:"+line);
}
}
}
public class Client {
public static void main(String[] args) throws Exception{
System.out.println("客户端启动.......");
//1,创建一个Socket的通信管道,连接服务器地址和端口
Socket socket = new Socket("127.0.0.1",8888);
//2,从Socket管道中得到一个字节输出流,因为这里是模拟客户端向服务端发信息,所以是得到一个输出流
OutputStream outputStream = socket.getOutputStream();
//3,把字节流包装成自己需要的数据流,进行数据的发送
PrintStream printStream = new PrintStream(outputStream);
//4,发送
printStream.println("客户端发送信息:你好,Server!");
printStream.flush();
}
}