Netty学习(一)介绍io模型

112 阅读1分钟

一、Netty是个啥?

刚开始学,体会不是很深刻,说说我的简单理解。

  • 一个异步、基于事件驱动的网络应用框架。异步好理解,基于事件驱动,这边我理解就是类似客户端、服务端这种请求响应的动作。
  • 针对TCP协议
  • 本质是一个NIO框架,这边引出NIO,后边会说

二、Netty的应用场景

举个例子:Dubbo框架节点间通信的底层原理就是用的Netty。

其实,涉及网络通信的应用的实现,应该都可以基于Netty。

三、从NIO引出的IO模型

java有3种网络类型的io模型:AIO、BIO、NIO

  • AIO
1)异步非阻塞,适用连接数多且长时间连接的场景
(2)异步通道,一个有效的请求才会启动线程
  • BIO
1)同步阻塞,一个请求对应一个线程

简单写了一个BIO的服务端的实现:

package com.angliali.bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BIOClientService {

    public static void main(String[] args) throws IOException {
        //1、创建线程池
        //2、如果有客户端连接,就创建一个线程,与之通信

        ExecutorService pool = Executors.newCachedThreadPool();
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器启动");
        while(true){
            final Socket socket = serverSocket.accept();
            System.out.println("连接一个客户端");

            pool.execute(new Runnable() {
                public void run() {
                    //与客户端通信
                    handler(socket);
                }
            });
        }
    }

    private static void handler(Socket socket){
        try {
            byte[] bytes = new byte[1024];
            InputStream inputStream = socket.getInputStream();
            while (true){
                int read = inputStream.read(bytes);
                if(read!= -1){
                    System.out.println(new String(bytes,0,read));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
  • NIO
1)同步非阻塞,由多个请求,通过多路复用,对应到一个线程中