`
粟谷_sugu
  • 浏览: 25374 次
社区版块
存档分类
最新评论

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

阅读更多
本文没有参考意义,仅作为我的读书笔记吧,所有功劳归功于下面链接的原作者
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,服务端有两个,用于维持本身的连接和响应客户端的连接。




0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics