基于阻塞与非阻塞网络模型的java语言实现

基于阻塞与非阻塞网络模型的java语言实现

ID:9010886

大小:29.00 KB

页数:7页

时间:2018-04-14

基于阻塞与非阻塞网络模型的java语言实现_第1页
基于阻塞与非阻塞网络模型的java语言实现_第2页
基于阻塞与非阻塞网络模型的java语言实现_第3页
基于阻塞与非阻塞网络模型的java语言实现_第4页
基于阻塞与非阻塞网络模型的java语言实现_第5页
资源描述:

《基于阻塞与非阻塞网络模型的java语言实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、本文对网络应用中阻塞通信与非阻塞通信工作机制及实现等问题进行了研究和探讨、提出了系统地实现阻塞与非阻塞通信的方法和步骤,文中对比了两种不同的网络通信方式,分别给出了基于阻塞与非阻塞IO开发高性能网络应用程序的具体实例。  1引言  Java平台传统的I/0系统基于byte(字节)和Stream(数据流)。这种模式下的I/O操作以字节为单位,以流的方式处理数据。而NIO(NewI/O)以块的方式处理数据,它的系统操作面向Buffer(缓冲),Channel(通道)和Selector(选择器),不再是字节,这种模式利用了操作系统管理内存和文件的方式,并将一些耗

2、时操作直接转移给操作系统,使JavaI/O的速度得以提高、性能得到了明显的改善。本文在研究和探讨JavaIO和NIO特性及其阻塞和非阻塞通信工作机制的基础上,分别探索了实现阻塞和非阻塞通信的方法、步骤。并针对一个网络应用实例,给出了两种模式的Java实现。  2阻塞式I/O工作原理  在Java平台上,处理有关I/0操作的方法通常是:当一个方法需要处理I/O有关的事务时,该方法立即被Java虚拟机设置成等待状态,直到有关的I/O操作完成。称这样的过程为阻塞IO。基本上可以将阻塞式I/O的网络程序过程描述如下:  (1)打开一个ServerSocket监听端

3、口。  (2)程序将阻塞,直到有连接请求。  (3)读取请求。  (4)发送响应。  (5)关闭连接。  (6)重复2-5步骤。  图1阻塞式I/O工作原理示意图  如图1所示。图中粗框的部分将被阻塞直至条件满足,这种模式导致过多的系统开销。通常我们设计多线程的应用程序来解决这个问题(如图2所示),客户端向服务器提交申请,服务器程序生成了一个拥有对应客户端的socket线程,该线程便成为了服务代理,每个线程代理一个客户端,服务器继续侦听连接请求,如果某个客户端出现了问题,例如连接中断,并不会影响服务的运行,但是每个客户端都始终保持与相应线程的连接,线程之间

4、是完全独立的。每个客户端激活一个新的线程。服务通过线程技术实现多链接,但是线程的建立需要较大的开销,数量较多的线程将会降低系统的运行速度。而且,我们并不是真正地需要如此大的开销来供应如此多的线程,这些线程没有有效地利用CPU,它们将大多数时间花费在I/O的阻塞上,所以这些线程是低效率的。  多线程服务器开发过程:  (1)写服务器端程序。  (2)在循环中调用多线程程序。  (3)为多线程程序传递Socket参数。  (4)写多线程程序。  图2利用多线程解决阻塞示意图  3非阻塞式NI/O工作原理  从Java1.4开始,引入一组新的API来进行I/O操

5、作(NIOAPI)。在NIOAPI中,一个重要的特征就是可实现非阻塞的网络I/O操作(non-blockingI/O),通过使用NIO,可以编写出性能更好、更易扩展的网络应用程序。新I/O可以轻松的处理较多的连接,这主要依靠新I/O引用的三个新概念和相应的工具包:  (1)线性排列的数据可读写缓冲(Buffer)。  (2)双向通道(Channel)--新的I/O抽象,在NIO中替代流。  (3)选择器(Selectors)。  缓冲区(Buffer)实质上是一个容器对象,它包含一些要写入或者刚读出的数据。NIO中加入缓冲对象,体现了新库与原I/O的一个重

6、要区别。在面向流的IO中,是将数据直接写入或者将数据直接读到Stream对象中。而在NIO中,任何时候所有数据都是用缓冲区处理。  图3一个容量为8的Buffer  通道(Channel)通常被认为代表了一个通向实体的连接,这个实体可以是文件、网络Socket或能够执行IO操作的程序组件。可以通过它读取和写入数据,它就像是流,但它是双向的,而流只是在一个方向上移动,在读写流时必须定义InputStream和OutputStream的对象,而通道可以用于读、写或者同时用于读写。NIO中主要是利用通道(Channel)处理Buffer的数据。  图4Chann

7、el处理Bufferr的数据示意  选择器(Selectors)是NIO中重要的概念,如果我们使用新的IO构造非阻塞的网络服务,如何判断是否有请求发生呢?这时我们就用的是Selector类,我们将一个可注册的Channel类SelectableChannel注册到—个Selector类中,Selector将为我们监听所有的I/0操作。选择器通过一个符号(SelectionKey)与被选择的通道交互,当一个通道被注册到选择器上的时候,选择器创建一个选择键与此通道相关联,在此后的操作中,选择器通过这个键操纵通道完成非阻塞的输入输出。  NIO是一种没有阻塞地读

8、写数据的方法。阻塞式IO通常在代码进行read()调用时,代码会阻

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。