“Netty是一个NIO C/S框架,能够快速、简单的开发协议服务器和客户端等网络应用。它能够很大程度上简单化、流水线化开发网络应用,例如TCP/UDP socket服务器。”
mina与netty都是Trustin Lee的作品,所以在很多方面都十分相似,他们线程模型也是基本一致,采用了Reactors in threads模型,即Main Reactor + Sub Reactors的模式。
由main reactor处理连接相关的任务:accept、connect等,当连接处理完毕并建立一个socket连接(称之为session)后,给每个session分配一个sub reactor,之后该session的所有IO、业务逻辑处理均交给了该sub reactor。每个reactor均是一个线程,sub reactor中只靠内核调度,没有任何通信且互不打扰。
Netty是一个主要用于编写高并发网络系统、网络应用和服务的Java库。Netty和 标准的Java APIs一个主要的差别在于它的异步API。这个名词对于不同的人来说意味着不同的东西,可能和非阻塞、事件驱动有相同的意义。先不管这些,如果你之前从未使用过异步API,习惯于编写顺序执行的程序,那么转换思路编写Netty程序有点麻烦。在这里简要的介绍我如何解决这个问题。
编写一个Netty示例并启动。和其他Java API一样,发起request很容易。在处理response需要转换思维,因为没有response。几乎每个方法调用都是异步的,这意味着没有返回值,而且调用常常是立刻返回的。结果(如果有的话)是 由 其他线程传回的。这是普通API和异步API的基本区别。假如一个客户端API提 供一个方法来从服务器获取widget的 数量。
public WidgetCountListener myListener = new WidgetCountListener() {
public void onWidgetCount(int widgetCount) {
...... doyour thing with the widget count
}
};
Netty中数据如何被分发是由ChannelBuffer完成的。
如果你的程序只是处理byte数组和byte缓冲区,那么你会很幸运因为使用ChannelBuffer。
然而,如果你需要处理更高级的数据,例如java对象,把这个数据发送到一个远程服务器,然后再接受另
外一个返回的对象,那么这些byte计划需要被转义。或者,如果你需要发起一个请求到一个HTTP服务器,
你的请求或许是从发起一个字符串类型URL来开始它的生命周期,但是它需要被包装成一个HTTP服务器能
够理解的request,然后分解为原始的byte,最后通过网络发送。HTTP服务器需要接收这些byte,并且把
它们解析一个符合格式的HTTP request。一旦请求成功,这个流程会被反过来执行:服务器的响应(或许
是一个JPEG图片或者JavaScript文件)必须被包装成一个HTTP response,转换为bytes,然后返回给发
起请求的客户端。
在Netty中,byte在网络流通的基本抽象是Channel。