IO模型之BIO快速理解

同步-异步-阻塞-非阻塞

说IO模型前先说一下同步-异步-阻塞-非阻塞的区分:
同步、异步关注的是消息通信机制
阻塞、非阻塞关注的是等待消息时的状态

同步、异步:比如本人去烧一壶水,然后水开之后还是需要本人亲自去把水装在水壶里这叫同步,假如水开后我不用去装水,由我提前安排好的人去做叫异步。
阻塞、非阻塞:如果在烧水的过程中我必须要在那等着水开叫阻塞,不用等在烧水期间我去做别的叫非阻塞。

快速理解BIO

基于上一篇的客户端和服务端建立连接后传输控制层会有一个socket,然后进行数据的传输。

什么是BIO? (Blocking IO )(Input Output)
BIO也叫阻塞的IO,就是当有一个客户端连上来时就会起一个线程去处理这个客户端,BIO也是比较简单的一个IO模型。
以下是BIO通信模型图
BIO为什么叫阻塞的IO ,因为在accept()的时候会阻塞,只有客户端连上的时候才会被唤醒,而且在处理read()和write()时也会阻塞,例如客户端没有发数据给你时,也会阻塞。具体可以看下面的案例代码。
在这里插入图片描述
》在服务端与客户端3次握手后需要进行数据传输,服务端就会去进行内容的系统调用,像socket()、bind()等等都是内核提供的方法。其中socket()=6fd 意思就是对应一个6的文件描述符号然后绑定一个8080的端口,如下图所示:
在这里插入图片描述

这是服务端

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket();
        ss.bind(new InetSocketAddress("127.0.0.1", 8888));
        while(true) {
            Socket s = ss.accept(); //阻塞方法
            new Thread(() -> {
                handle(s);
            }).start();
        }
    }
    static void handle(Socket s) {
        try {
            byte[] bytes = new byte[1024];
            int len = s.getInputStream().read(bytes);
            System.out.println(new String(bytes, 0, len));
            s.getOutputStream().write(bytes, 0, len);
            s.getOutputStream().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

这是客户端

public class Client {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("127.0.0.1", 8888);
        s.getOutputStream().write("HelloServer".getBytes());
        s.getOutputStream().flush();
        //s.getOutputStream().close();
        System.out.println("write over, waiting for msg back...");
        byte[] bytes = new byte[1024];
        int len = s.getInputStream().read(bytes);
        System.out.println(new String(bytes, 0, len));
        s.close();
    }
}

BIO会有着很大的问题,当有一万个线程的时候就会非常耗资源,而且效率极低,很少使用,所以后面出来了NIO。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值