netty代码解析(转)

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序

整体来看其包含了以下内容:

1.提供了丰富的协议编解码支持,

2.实现自有的buffer系统,减少复制所带来的消耗,

3.整套channel的实现,

4.基于事件的过程流转以及完整的网络事件响应与扩展,

5.丰富的example。本文并不对Netty实际使用中可能出现的问题做分析,只是从代码角度分析它的架构以及实现上的一些关键细节。

 

Netty使用(其自带example很好展示了使用):

Netty普通使用一般是通过BootStrap来启动,BootStrap主要分为两类:

1.面向连接(TCP)的BootStrap(ClientBootStrap和ServerBootstrap),

2.非面向连接(UDP)的(ConnectionlessBootstrap)。

 

 

Netty整体架构很清晰的分成2个部分,ChannelFactory和ChannelPipelineFactory,

前者主要生产网络通信相关的Channel实例和ChannelSink实例,Netty提供的ChannelFactory实现基本能够满足绝大部分用户的需求,当然你也可以定制自己的ChannelFactory。

后者主要关注于具体传输数据的处理,同时也包括其他方面的内容,比如异常处理等等,只要是你希望的,你都可以往里添加相应的handler,一般ChannelPipelineFactory由用户自己实现,因为传输数据的处理及其他操作和业务关联比较紧密,需要自定义处理的handler。

 

现在,使用Netty的步骤实际上已经非常明确了,比如面向连接的Netty服务端客户端使用,

第一步:实例化一个BootStrap,并且通过构造方法指定一个ChannelFactory实现,

第二步:向bootstrap实例注册一个自己实现的ChannelPipelineFactory,

第三步:如果是服务器端,bootstrap.bind(new InetSocketAddress(port)),然后等待客户端来连接,如果是客户端,bootstrap.connect(new InetSocketAddress(host,port))取得一个future,这个时候Netty会去连接远程主机,在连接完成后,会发起类型为CONNECTED的ChannelStateEvent,并且开始在你自定义的Pipeline里面流转,如果你注册的handler有这个事件的响应方法的话那么就会调用到这个方法。在此之后就是数据的传输了。下面是一个简单客户端的代码解读。

// 实例化一个客户端Bootstrap实例,其中NioClientSocketChannelFactory实例由Netty提供

        ClientBootstrap bootstrap = new ClientBootstrap(

                new NioClientSocketChannelFactory(

                        Executors.newCachedThreadPool(),

                        Executors.newCachedThreadPool()));




        // 设置PipelineFactory,由客户端自己实现

        bootstrap.setPipelineFactory(new FactorialClientPipelineFactory(count));




        //向目标地址发起一个连接

        ChannelFuture connectFuture =

            bootstrap.connect(new InetSocketAddress(host, port));



        // 等待链接成功,成功后发起的connected事件将会使handler开始发送信息并且等待messageRecive,当然这只是示例。

        Channel channel = connectFuture.awaitUninterruptibly().getChannel();


        // 得到用户自定义的handler

        FactorialClientHandler handler =

            (FactorialClientHandler) channel.getPipeline().getLast();


        // 从handler里面取数据并且打印,这里需要注意的是,handler.getFactorial使用了从结果队列result take数据的阻塞方法,而结果队列会在messageRecieve事件发生时被填充接收回来的数据

        System.err.format("Factorial of %,d is: %,d", count, handler.getFactorial());



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值