nio、bio区别,应运场景

bio阻塞i/o

a.面向流的,InputStream(),OuputStream字节输入流,字节输出流Reader,Writer字符输入流,字符输出流
b.阻塞的IO,比如Socket,它的底层用的BIO机制,accept()、connect()、write()调用时会产生阻塞。阻塞模型的局限性:不可能应对高并发、搞访问量的场景

总结:BIO方式适用于连接数目比较小并且一次发送大量数据的场景,这种方式对服务器资源要求比较高,并发局限于应用中

以下是简单的bio例子:

Server端代码:


import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 * @author 
 * @date   2019-02-27
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket();
        socket.bind(new InetSocketAddress(9999));
        while(true) {
            Socket sc = socket.accept();
            new Thread(new Accept(sc)).start();
        }
    }
}
class Accept implements Runnable{
    private Socket sc = null;
    public Accept(Socket sc) {
        sc = this.sc;
    }
    @Override
    public void run() {
        System.out.println("提供服务的线程id是:"+Thread.currentThread().getId());
    }
    
}

Clinet端代码

/**
 * 
 * @author 
 * @date   2019-02-27
 */
public class Client {
    public static void main(String[] args) throws IOException {
        Socket sc = new Socket();
        sc.connect(new InetSocketAddress( "127.0.0.1",9999),0);
        while(true) {
            
        }
    }
}

启动server端,然后多次启动client端,打印结果如下

nio非阻塞i/o

a.面向缓冲区的(Buffer),NIO是通过缓冲区去操作数据的,可以用缓冲区灵活操作数据,此外,NIO是面向通道的(Channel),在通道上,即可以读数据,也可以写数据

b.NIO是非阻塞的IO,可以利用NIO处理高并发和高访问量的场景,NIO适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java的nio实现。服务器需要支持超大量的长时间连接。比如10000个连接以上,并且每个客户端并不会频繁地发送太多数据

猜你喜欢

转载自www.cnblogs.com/XiOrang/p/10446931.html