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来完成的。