基于阻塞和非阻塞网络模型的Java语言实现.docVIP

基于阻塞和非阻塞网络模型的Java语言实现.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于阻塞和非阻塞网络模型的Java语言实现

  本文对网络应用中阻塞通信与非阻塞通信工作机制及实现等问题进行了研究和探讨、提出了系统地实现阻塞与非阻塞通信的方法和步骤,文中对比了两种不同的网络通信方式,分别给出了基于阻塞与非阻塞IO开发高性能网络应用程序的具体实例。   1 引言   Java平台传统的I/0系统基于byte(字节)和Stream(数据流)。这种模式下的I/O 操作以字节为单位,以流的方式处理数据。而NIO( New I/O )以块的方式处理数据,它的系统操作面向Buffer(缓冲),Channel(通道)和Selector(选择器),不再是字节,这种模式利用了操作系统管理内存和文件的方式,并将一些耗时操作直接转移给操作系统,使JavaI/O的速度得以提高、性能得到了明显的改善。本文在研究和探讨Java IO和NIO特性及其阻塞和非阻塞通信工作机制的基础上,分别探索了实现阻塞和非阻塞通信的方法、步骤。并针对一个网络应用实例,给出了两种模式的Java实现。   2 阻塞式I/O工作原理   在Java平台上,处理有关I/0操作的方法通常是:当一个方法需要处理I/O有关的事务时,该方法立即被Java虚拟机设置成等待状态,直到有关的I/O操作完成。称这样的过程为阻塞IO。基本上可以将阻塞式I/O的网络程序过程描述如下:   (1)打开一个ServerSocket监听端口。   (2)程序将阻塞,直到有连接请求。   (3)读取请求。   (4)发送响应。   (5)关闭连接。   (6)重复2-5步骤。   图1 阻塞式I/O工作原理示意图   如图1所示。图中粗框的部分将被阻塞直至条件满足,这种模式导致过多的系统开销。通常我们设计多线程的应用程序来解决这个问题(如图2所示),客户端向服务器提交申请,服务器程序生成了一个拥有对应客户端的socket线程,该线程便成为了服务代理,每个线程代理一个客户端,服务器继续侦听连接请求,如果某个客户端出现了问题,例如连接中断,并不会影响服务的运行,但是每个客户端都始终保持与相应线程的连接,线程之间是完全独立的。每个客户端激活一个新的线程。服务通过线程技术实现多链接,但是线程的建立需要较大的开销,数量较多的线程将会降低系统的运行速度。而且,我们并不是真正地需要如此大的开销来供应如此多的线程,这些线程没有有效地利用CPU,它们将大多数时间花费在I/O的阻塞上,所以这些线程是低效率的。   多线程服务器开发过程:   (1) 写服务器端程序。   (2) 在循环中调用多线程程序。   (3) 为多线程程序传递Socket参数。   (4) 写多线程程序。   图2 利用多线程解决阻塞示意图   3非阻塞式NI/O工作原理   从Java 1.4开始,引入一组新的API来进行I/O操作(NIO API)。在NIO API中,一个重要的特征就是可实现非阻塞的网络I/O操作(non-blocking I/O),通过使用NIO,可以编写出性能更好、更易扩展的网络应用程序。新I/O可以轻松的处理较多的连接,这主要依靠新I/O引用的三个新概念和相应的工具包:   (1) 线性排列的数据可读写缓冲(Buffer)。   (2) 双向通道(Channel)--新的I/O抽象,在NIO中替代流。   (3) 选择器(Selectors)。   缓冲区(Buffer)实质上是一个容器对象,它包含一些要写入或者刚读出的数据。NIO中加入缓冲对象,体现了新库与原I/O的一个重要区别。在面向流的IO中,是将数据直接写入或者将数据直接读到Stream对象中。而在NIO中,任何时候所有数据都是用缓冲区处理。   图3 一个容量为8的Buffer   通道(Channel)通常被认为代表了一个通向实体的连接,这个实体可以是文件、网络Socket或能够执行IO操作的程序组件。可以通过它读取和写入数据,它就像是流,但它是双向的,而流只是在一个方向上移动,在读写流时必须定义InputStream和OutputStream的对象,而通道可以用于读、写或者同时用于读写。NIO中主要是利用通道(Channel)处理Buffer的数据。   图4 Channel处理Bufferr的数据示意   选择器(Selectors)是NIO中重要的概念,如果我们使用新的IO构造非阻塞的网络服务,如何判断是否有请求发生呢?这时我们就用的是Selector类,我们将一个可注册的Channel类SelectableChannel注册到—个Selector类中,Selector将为我们监听所有的I/0操作。选择器通过一个符号(Selection Key)与被选择的通道交互,当一个通道被注册到选择器上的时候,选择器创建一个选择键与此通道相关联,在此后的操作中,选择器通过这个键操纵通道完成非阻

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档