Netty基础

169 阅读2分钟

Netty特点

Netty是一款基于java NIO开发的网络通信框架, 帮助用户快速简便开发高性能协议服务端和客户端

  • 高并发: 基于NIO
  • 传输快: 零拷贝减少不必要的内存拷贝
  • 封装好: 易于使用的接口

复习:

BIO

Blocking, 每个用户连接请求建立一个线程处理, 连接后服务端调用read()读取用户数据, 如果用户无数据或数据未准备好(需要从内核态通过系统调用, 在内核态复制, 再回到用户态), 则线程一直阻塞等待

伪异步BIO

将用户连接请求放入队列, 用一个线程提供连接服务, 但依然一个线程只能服务一个连接, 无数据/数据未准备好时阻塞等待

NIO

同步非阻塞

用户连接请求后, 建立服务端线程, 但线程立即返回, 执行其他内容, 无需等待. 由一个线程轮询数据是否准备好,

java NewIO

服务端一个线程(server selector)负责轮询是否有新的连接请求, 如果有就将其注册到client selector上, client selector轮询发现数据准备好后才启动一个线程处理

AIO

异步指程序不需要轮询或等待数据, 而是立即返回, 由操作系统通知I/O完成

java BIO 编程

public static void main (String args[]) throws IOException {
	ServerSocket ss = new ServerSocket(8080);
    while(true){
    	Socket socket = ss.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while ((line = br.readLine()) != null) {
        	System.out.println(br.read());
        }
    }
}

Netty 编程

public class EchoServer {
    private final int port;

    public EchoServer(int port) {
        this.port = port;
    }

    public static void main(String[] args) throws InterruptedException {
        new EchoServer(8888).start();
    }

    public void start() throws InterruptedException {
        final EchoServerHandler serverHandler = new EchoServerHandler();//处理数据的类
        //创建EventLoopGroup,处理事件的循环线程池
        EventLoopGroup boss = new NioEventLoopGroup();// 处理连接请求
        EventLoopGroup worker = new NioEventLoopGroup();// 处理数据读写
        try {
            ServerBootstrap b = new ServerBootstrap();// 服务引导类
            b.group(boss,worker)
                    //指定所使用的NIO传输 Channel
                    .channel(NioServerSocketChannel.class)
                    //使用指定的端口设置套接字地址
                    .localAddress(new InetSocketAddress(port))
                    //添加一个EchoServerHandler到子Channel的ChannelPipeline
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            //EchoServerHandler标志为@Shareable,所以我们可以总是使用同样的实例
                            socketChannel.pipeline().addLast(serverHandler);// handler实际处理数据
                        }
                    });
            //异步的绑定服务器,调用sync()方法阻塞等待直到绑定完成
            ChannelFuture future = b.bind().sync();
            future.channel().closeFuture().sync();
        } finally {
            //关闭EventLoopGroup,释放所有的资源
            group.shutdownGracefully().sync();
            worker.shutdownGracefully().sync();
        }
    }
}
/*
作者:pjmike_pj
链接:https://juejin.cn/post/6844903682425749517
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/