欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

netty系列(0)----非常浅薄的初探或者叫读书笔记

程序员文章站 2024-02-02 08:31:46
...
本文没有参考意义,仅作为我的读书笔记吧,所有功劳归功于下面链接的原作者
https://segmentfault.com/a/1190000014969780
下面这个链接也给我很大帮助
https://www.iteye.com/magazines/132-Java-NIO#579]

netty学习笔记
不像之前的的阻塞性IO,必须为每个任务都分配一个Thread,大量的Thread会造成上下文的大量切换,耗费时间
NIO提供了一种非阻塞性IO,用一个selector来为IO操作选择空闲的Thread

Netty的几个关键知识点
1:channel 
因为IO操作的几个原语bind()、connect()、read()和write()属于底层的实现,之前用socket来作为实体操作。现在在netty中提供了channel的api大大简化了难度。
2:回调
很简单就是按我们所知的,预留的一个方法,当某个任务完成后,调用的方法
3:channelFuture
扩展了juc.Future的方法, 不用时刻去检查是否已完成, 而是提供开放注册一系列的channelFutureListener,当完成后会主动调用listener的operateCompelete方法。
Channel channel = ...;
// 连接远程节点
ChannelFuture future = channel.connect(
    new InetSocketAddress("192.168.0.1", 25));
//注册一个ChannelFutureListener,以便在操作完成时获得通知
future.addListener(new ChannelFutureListener() {
    @Override
        public void operationComplete(ChannelFuture future) {
        //状态判断
        if (future.isSuccess()){
            //如果操作是成功的,则创建一个ByteBuf 以持有数据
            ByteBuf buffer = Unpooled.copiedBuffer(
                "Hello",Charset.defaultCharset());
            //将数据异步地发送到远程节点。返回一个ChannelFuture
            ChannelFuture wf = future.channel()
                .writeAndFlush(buffer);
            ....
        } else {
            //如果发生错误,则访问描述原因的Throwable
            Throwable cause = future.cause();
            cause.printStackTrace();
        }
    }
});

提供了一个例子, 因为连接是异步,所以connect会立刻返回,通过向channelFuture注册listener的方式,在操作完成后回调方法。
4: ChannelHandler
作为处理事件的进入和出流的用户可自编辑的组件, 初步理解为一个处理逻辑的链
5: ChannelPipeline
初步理解为ChannelHandle的容器,通过api将Handler加入到Pipeline中
6:EventLoop
没看懂, 每个EventLoopGroup可能有多个EventLoop,用于处理连接的生命周期中所发生的事件
#TODO
7:Bootstrap和ServerBootstrap
Boot为客户端,Server为服务端
客户端有两个EventLoopGroup,服务端有两个,用于维持本身的连接和响应客户端的连接。