同步阻塞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编程模型,很简单的一个小例子,希望对你有所帮助。代码传送门

最新文章

  1. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统
  2. JavaScript创建对象及对象继承
  3. 生成bat文件及sh文件
  4. 离线安装 Cloudera ( CDH 5.x )
  5. WinForm------TreeList修改节点图标和按钮样式
  6. 25-React事件处理及条件渲染
  7. .net常用组件
  8. Oracle中rownum的用法
  9. A Statistical View of Deep Learning (I): Recursive GLMs
  10. Android应用程序安装与Launcher启动机制
  11. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
  12. CF368 D - Persistent Bookcase
  13. ie兼容问题记录
  14. 经典51道SQL查询练习题
  15. Weblogic记录
  16. Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)
  17. 设计模式---单一职责模式之桥模式(Bridge)
  18. .net的架构模式
  19. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(二)[超详细教程] ubuntu16.04版本
  20. Oracle 更改字符集 更改后之前的中文全成乱码了

热门文章

  1. 虚拟机克隆后修改mac地址和ip地址
  2. Python - 一行代码查看当前操作系统默认的编码标准
  3. Highcharts › 自由绘图
  4. 菜鸡的Java笔记 第二十一 final 关键字
  5. kafka数据清理
  6. 90-95年CPU功耗感知调度研究
  7. [noi109]排队
  8. Roslyn+T4+EnvDTE项目完全自动化 (一)
  9. SSM(Spring-MyBatis-SpringMVC)框架整合【完整版】
  10. Dapr-可观测性