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();
    }
}

消息单发