Netty源码解析(一)----Bio和Nio的区别

一、传统的Bio编程模型。

  • 示例代码:
        //1、绑定到8888端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //2、一直阻塞直到有远程连接
        Socket clientSocket = serverSocket.accept();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out =
                new PrintWriter(clientSocket.getOutputStream(), true);
        String request, response;
        while ((request = in.readLine()) != null) {
            if ("Done".equals(request)) {
                break;
            }
            response = processRequest(request);
            out.println(response);
        }
  • 1、创建ServerSocket并绑定到8888端口。
  • 2、accept阻塞直到有新的连接。

  • 传统Bio编程模型,是基于多线程阻塞的网络编程模型,每个ServerSocket在accept到一个远程连接的socket的时候都会开启一个新的线程去处理新的socket读写,但在大多数时候,新的线程都处在阻塞状态,等待可以读或可以开始写入的数据到来。大量线程阻塞,在可写或读的数据到来的时候线程被唤醒,造成大量的线程上下文的切换,这本身就是一个不小的开销。这种模式可以支撑小数量客户端并发请求,当并发量上升到1W+以上是很不理想的。

二、Nio线程模型。

  • Nio是基于事件通知的非阻塞IO,在同一个线程中可以同时处理多个Socket的读写事件。Nio模型中的Selector是非阻塞IO实现的关键,它是基于事件通知的API以确定在一组非阻塞套接字中哪些已经就绪能够进行相关的IO操作。与Bio相比,这种模型提供了更好的资源管理,使用较少线程便可以处理许多连接,因此也减少了内存管理和上下文切换带来的开销。当没有IO操作需要的时候,线程也可被用于其他任务。
发布了12 篇原创文章 · 获赞 0 · 访问量 1152

猜你喜欢

转载自blog.csdn.net/qq_32713701/article/details/104456197