flex与JAVA开发指南.pdf
文本预览下载声明
http ://
Cindy User Guide
版本号 修改时间 修改人 备注
1.0 2005-03- 12 Roger Chen Based on Cindy-2.3 RC
2.0 2006-03-02 Roger Chen Based on Cindy-3.0 a3
http ://
Cindy 简介
Cindy 是一个基于Java NIO 的异步I/O 框架,支持TCP、UDP 以及Pipe ,为应用提供
了一个统一的模型,并能够方便的切换异步和同步操作。
为什么不使用Java IO?
Java IO 包采用阻塞模型来处理网络操作。假设应用调用了read 方法读取来自网络流上
的数据,而数据尚未到达本机,则对read 方法的调用将一直等到数据到达并成功接收后才
返回。由于IO 包的所有操作会一直阻塞当前线程,为了不影响其他事务的处理,在一般情
况 应用总是会用一个独立线程或线程池来处理这些I/O 操作。
Java IO 包阻塞模型的优点就 非常简单易用,如果配合上线程池,效率也非常不错,
所以得到了广泛的应用。但这种简单模型也有其固有的缺点:扩展性不足。如果应用只需要
进行少量的网络操作,那么开启若干个单独的I/O 线程无伤大雅;但 如果 实现一个服务
端的应用,需要同时处理成千上万个网络连接,采用阻塞模型的话就要同时开启上千个线程。
虽然现在强劲的服务器能够负担起这么多线程,但操作系统花在线程调度上的时间也会远远
多于用于处理网络操作上的时间。
为什么要使用Java NIO?
采用IO 包的阻塞模型,如果数据量不大的话,则线程的大部分时间都会耗费在等待上。
对于希缺的服务器资源而言,这是一种极大的浪费。
在Java 1.4 中引入的NIO 包里,最引人注 的就 加入了非阻塞I/O 。和IO 包提供的
阻塞模型不同的 ,对一个非阻塞的连接进行操作,调用会立即返回,而不是等待。假设应
用调用了read 方法读取来自网络流上的数据,而数据尚未到达本机,则对read 方法的调用
将立即返回,并通知应用 前只能读到0 个字节。应用可以根据自身的策略来进行处理,比
如读取其他网络连接的数据等等,这就使得一个线程管理多个连接成为可能。
NIO 包还引入了Selector 机制,将一个非阻塞连接注册在Selector 上,应用就不需去轮
询该连接当前 否可以读取数据,而 接收到数据后Selector 会通知该连接。这样就使得可
以用更少的线程数来管理更多的连接。
为什么选择Cindy,而不直接使用NIO?
Java NIO 包虽然提供了非阻塞I/O 模型,但是直接使用NIO 的非阻塞I/O 需要成熟的网
http ://
络编程经验,处理众多底层的网络异常,以及维护连接状态,判断连接超时等等。对于关注
于其业务逻辑的应用而言,这些复杂性都是不必要的。不同Java 版本的NIO 实现也会有一
些Bug ,Cindy 会巧妙的绕开这些已知的Bug 并完成相应功能。并且NIO 本身也在不断发
展中,Java 1.4 的NIO 包中只实现了TCP/UDP 单播/Pipe ,Java 5.0 中引入的SSLEngine 类
使得基于非阻塞的流协议(TCP/Pipe )支持 SSL/TLS 成为可能,在未来的版本中还可能会
加入非阻塞多播的实现。Cindy 会关注这些新功能,并纳入到统一的框架中来。
而且Cindy 虽然 前的实现是基于NIO ,但它会不仅仅局限于NIO 。等到一些基于操作
系统本身实现的AIO (Asynchronous IO )类库成熟后,它也会加入对这些类库的支持,通
过操作系统本身实现的AIO 来提高效率。
如果应用程序只想使用一种高效的模型,而不想关心直接使用NIO 所带来的这些限制,
或希望将来无需更改代码就切换到更高效率的AIO 实现上,那么 Cindy 会是一个很好的选
择。并且使用Cindy,应用可以在同步和异步之间进行无缝切换,对于大部分操作是异步,
可某些特殊操作需要同步的应用
显示全部