Netty源码学习(一)----概述

Netty和Mina一样,是java世界里非常著名的通讯框架,并且出自同一人之手。

Netty和Mina不一样,是Netty诞生较晚,开始在JBoss名下,后来自立门户netty.io。而Mina则属于Apache基金会。

一奶同胞,同源而异。


Netty目前有两个分支:4.x和3.x。4.0分支重写了很多东西,并对项目进行了分包,规模庞大,入手困难。

而3.0版本则已经被广泛使用。本次学习完全基于netty3.2.7版本。欢迎指正,欢迎打脸。


大概用Netty的,无论新手老手、鲜肉蜀黍,都知道它是一个“网络通讯框架”。

那么,何谓框架呢?

所谓框架,笔者不太清楚它的定义。作用却知道一些:基于底层API,提供更便捷的编程模型。

那么,Netty如何基于底层的API,又如何让编程模型更便捷呢?

这个问题,不易回答。

我们反过来看这个问题,如果不用Netty,直接基于NIO编写网络程序,我们需要做什么?

下面以Server端TCP连接为例,这里我们使用Reactor模型(Reactor模式采用同步IO):

1、监听端口,建立socket连接;

2、建立线程,处理内容

1)、读取socket内容,并对协议进行解析;

2)、逻辑处理;

3)、回写相应内容;

4)、如果是多次交互的应用(SMTP、FTP),则需要保持连接多进行几次交互;

3、关闭连接。

建立线程是一个比较耗时的操作,同时维护线程本身也有一些开销,所以我们需要多线程机制。

此外,因为TCP连接的特性,我们还要使用连接池进行管理。

想想头都大了。。。。

幸好,我们有Netty。。。


Netty之初体验-----------------------------------------------------------

这里我们引用Netty的example包里的一个例子,一个简单的EchoServer,它接受客户端输入,并将输入原样返回给客户端。

其主要代码如下:

public void run() {
// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));

// Set up the pipeline factory.
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(new EchoServerHandler());
}
});

// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(port));
}
下面的EchoServerHandler是其业务逻辑的实现者:

public class EchoServerHandler extends SimpleChannelUpstreamHandler {

    @Override
    public void messageReceived(
            ChannelHandlerContext ctx, MessageEvent e) {
        // Send back the received message to the remote peer.
        e.getChannel().write(e.getMessage());
    }
}

so easy,不是吗?


Netty之背后的事件驱动机制------------------------------------------

完成了上述的一段代码,就算是完成了跟Netty的第一次亲密接触。如果想深入学习Netty,还需要做到什么呢?

学习Netty的关键点,除了NIO的相关知识,另一个就是事件驱动的设计思想。

什么叫事件驱动?

我们回头看看EchoServerHandler中的public  void  messagereceived(ChannelHandlerContext ctx, MessageEvent e),其中的参数MessageEvent就是一个事件。

该事件携带了一些信息,例如e.getMessage()就是消息的内容,而EchoServerHandler则描述了处理这种事件的方式。

一旦某个事件触发,相应的Handler则会被调用,并进行处理。


在Netty里,所有事件都来自ChannelEvent接口,这些事件涵盖监听端口、建立连接、读写数据等网络通讯的各个阶段。

而事件的处理者就是ChannelHandler。事实上,Netty内部的连接处理、协议编解码、超时等机制,都是通过Handler来完成的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值