美文网首页
BIO(Blocking IO)

BIO(Blocking IO)

作者: silence_J | 来源:发表于2020-04-15 11:34 被阅读0次
  • 模型


    BIO.png

    这种模型每有一个客户端进行连接,服务端就会创建一个线程进行处理。

  • demo实例如下:
    Server:
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(); // 实际中要做try catch处理
        serverSocket.bind(new InetSocketAddress("127.0.0.1", 8888));
        while (true) {
            Socket socket = serverSocket.accept(); // 阻塞方法

            new Thread(() -> {
                handle(socket);
            }).start();
        }
    }

    static void handle (Socket socket) {
        try {
            byte[] bytes = new byte[1024];
            int length = socket.getInputStream().read(bytes); // 阻塞
            System.out.println(new String(bytes, 0, length));
            // 通道是单向的
            socket.getOutputStream().write(bytes, 0, length); // 阻塞
            socket.getOutputStream().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Client:

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8888);
        socket.getOutputStream().write("[Client]-->Hello Server".getBytes());
        socket.getOutputStream().flush();

        System.out.println("write over, waiting for msg back ...");
        byte[] bytes = new byte[1024];
        int len = socket.getInputStream().read(bytes);
        System.out.println(new String(bytes, 0, len));
        socket.close();
    }
}
  • 为什么要创建一个新的线程?
    因为bio的server是阻塞的(accept是阻塞方法),处理client连接时若由server直接处理,这时其它client将不能连接。

此外 handle 方法中 read 和 write 也是阻塞的,如果只是建立了连接而没有传数据,也会阻塞。
由于bio中各种阻塞,所以效率特别低,并发性也不好,在实际网络编程中很少使用。但是在client少,并发量低的情况下bio简单方便也可使用。

相关文章

网友评论

      本文标题:BIO(Blocking IO)

      本文链接:https://www.haomeiwen.com/subject/jioqvhtx.html