同步阻塞IO模型

同步阻塞IO模型

有上篇IO模型中的,同步阻塞IO模型,我们能够知道,用户线程发起请求后就一直阻塞的等待 内核完成准备数据、数据拷贝的工作。并且返回成功的指示。

实现

使用java来实现同步阻塞IO模型,即我们所说的BIO的模型

客户端实现

/**
 * @author:triumphxx
 * @Date:2021/10/12
 * @Time:10:29 下午
 * @微信公众号:北漂码农有话说
 * @网站:http://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: BIO网络编程模型客户端
 **/

public class BIOClient {
    public static void main(String[] args) {
        try {
            //连接服务端
            Socket socket = new Socket("localhost",9000);
            //准备给服务端发送的信息
            socket.getOutputStream().write("hello server".getBytes());
            //开始发送信息
            socket.getOutputStream().flush();
            System.out.println("客户端信息发送完成");
            byte[] bytes = new byte[1024];
            socket.getInputStream().read(bytes);
            System.out.println("服务端返回的信息为:"+new String(bytes));
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

由代码可以看出来,客户端的代码非常简单,即建立连接、发送信息、接收信息

服务端实现

/**
 * @author:triumphxx
 * @Date:2021/10/12
 * @Time:10:29 下午
 * @微信公众号:北漂码农有话说
 * @网站:http://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: BIO网络编程模型服务端
 **/

public class BIOServer {

    public static void main(String[] args) throws IOException {
        //创建一个Socket服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //创建线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        //服务端启动后等待着客户端的请求
        while (true){
            System.out.println("等待连接");
            //阻塞的方法,等待连接
            final Socket socket = serverSocket.accept();
            System.out.println("有客户端的连接进来了");
            //BIO的特点,每进来一个客户端的请求都需要创建线程去处理
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    dealMessage(socket);
                }
            });
        }

    }

    public static void dealMessage(Socket socket) {
        System.out.println("线程名称为" + Thread.currentThread().getName());
        System.out.println("开始读取信息");
        try {
            byte[] bytes = new byte[1024];
            InputStream inputStream = socket.getInputStream();
            inputStream.read(bytes);
            System.out.println("接收到客户端的信息为:"+new String(bytes));
            socket.getOutputStream().write("客户端你好,接收到了你的信息".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

有服务端的代码,我们可以看到,服务端每接收一个请求就得线程池分配一个线程去处理这个请求。 每一行代码的意思,作者都已经进行表明。

优点及缺点

优点:编程模型简单 缺点:需要大量线程,可靠性差,吞吐量差,阻塞

适用场景

适用于连接比较少且比较固定的场景,编程模型最简单

小结

以上就是javaBIO编程模型,很简单的一个小例子,希望对你有所帮助。代码传送门

posted on 2021-12-08 21:08  北漂码农有话说  阅读(56)  评论(0编辑  收藏  举报