非阻塞套接字(Nonblocking Sockets) 概述.docx_第1页
非阻塞套接字(Nonblocking Sockets) 概述.docx_第2页
非阻塞套接字(Nonblocking Sockets) 概述.docx_第3页
非阻塞套接字(Nonblocking Sockets) 概述.docx_第4页
非阻塞套接字(Nonblocking Sockets) 概述.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

非阻塞套接字(Nonblocking Sockets) 概述非阻塞套接字(Nonblocking sockets),自J2SE 1.4版引入,它允许网络通信在应用程序和没有阻塞的进程中使用套接字。在这篇文章中,将详细介绍什么是Nonblocking sockets,怎样工作及其用途。 由 于JSR 5 非阻塞套接字(Nonblocking sockets),自J2SE 1.4版引入,它允许网络通信在应用程序和没有阻塞的进程中使用套接字。在这篇文章中,将详细介绍什么是Nonblocking sockets,怎样工作及其用途。由 于JSR 51的面世,从Java 1.4起,程序员便能用一组新的API来进行I/O操作。自2000年一月的Java 1.4 beta版,程序员便可以使用JSR 51了。在Java 1.4中用一些最重要的新特征来处理诸如在文件和套接字上高性能的读/写操作,正规表达式,译码/编码字符集,内存映射和文件锁定。在这篇文章中,我们将 讨论一个特殊的新概念New I/O API: Nonblocking sockets。非阻塞套接字允许在通道上做输入/输出操作而不用阻塞使用该通道的进程。我正在讨论异步的高性能的读/写操作,同样,你将看到,翻转上下设计和开发基于接口的应用程序技巧。Java开发者也许会问,为什么介绍一种新的技术来处理套接字?Java 1.3.x的套接字又有哪些问题?假设实现服务器端接受不同的客户端的连接;同样,假设客户端能支持处理同步的多请求;那么,使用Java 1.3.x,开发这样的服务器端有两种不同的选择:实现多线程服务为每个连接用户处理线程。使用外部第三方模块。这 两种方法都可以实现,但是如果适用第一种方法整个线程管理方案,包括相关并发性和冲突问题都需要靠程序员来处理。第二个方案也许花费更大,且使应 用程序依靠“nonJDK”的外部模块。依靠非阻塞套接字,你能实现非阻塞的服务无需直接管理线程或者采用外部模块。Buffer在 我们考虑非阻塞套接字以前,不得不花费一些字句在一个新的Java 1.4的类:java.nio.Buffer上。一个Buffer实例只是原始数据的一个有限的容器。称其有限是因为它只能包含有限数量的字节;换句话 说,它不是一个像Vector或是ArrayList一样的容器,后两者从理论上说是没有限度的。另外,一个Buffer实例仅能包含属于Java的基本 数据类型。例如:int,char,double,Boolean,等等。Buffer类是一个抽象类,它有7个子类分别对应于七种基本的数据类型:ByteBufferCharBufferDoubleBufferFloatBufferIntBufferLongBufferShortBuffer在非阻塞化套接字编程中,通常所有新 I/O系统能工作的环境中,解决Buffer对象如何工作是关键。这是因为新套接字通道使用Buffer对象通过网络来传送数据。你可以使用以下静态方法(即类方法)来创建一个新的Buffer实例:allocate,allocateDirect,wrap。在下面的例子中,三个Buffer对象将用三种不同的方法来实例化。ByteBuffer buffer1 = ByteBuffer.allocate(1024);ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024);ByteBuffer buffer3 = ByteBuffer.wrap(new String(hello).getBytes();这段代码的前两行创建了两个ByteBuffer对象,它们都包含1024个字节。allocate和allocateDirect方法都做了相 同的工作,不同的是第二个方法直接使用操作系统来分配Buffer。因而它将提供更快的访问速度。不幸的是,并非所有的虚拟机都支持这种直接分配的方法。 第三行使用wrap方法。它创建了一个ByteBuffer对象,包含的字节由字符串“hello”组成。Buffer对象的作用或多或 少的与流的作用相似。“当前位置(current position)”是一个极其重要的概念,它计算出你将要处理的Buffer对象的适当的位置。在任何时候,一个Buffer对象都有一个当前位置指向 某一项。之后,每一次读或写操作都会自动的将当前位置指向Buffer中的下一项。你可以用put方法写入一些数据到Buffer中:/ Writing on a bufferIntBuffer buffer = IntBuffer.allocate(10);for (int i=0; i 0) / Get keysSet keys = selector.selectedKeys();Iterator i = keys.iterator();/ For each key.while (i.hasNext() SelectionKey key = (SelectionKey)i.next();/ Remove the current keyi.remove();/ Get the socket channel held by the keySocketChannel channel = (SocketChannel)key.channel();/ Attempt a connectionif (key.isConnectable() / Connection OKSystem.out.println(Server Found);/ Close pendent connectionsif (channel.isConnectionPending()channel.finishConnect();/ Write continuously on the bufferByteBuffer buffer = null;for (;) buffer = ByteBuffer.wrap(new String( Client + id + ).getBytes();channel.write(buffer);buffer.clear();也许,客户端应用程序的结构让你回忆起服务器端应用程序的结构。然而,这里也有许多不同的地方。套接字通道使用OP_CONNECT选项连接到选择器上,意思是当服务器接受连接时选择器将不得不通知客户端,这个循环不是无穷的。While循环的条件是:while (selector.select(500) 0)意 思是客户端尝试连接,最大时长是500毫秒;如果服务器端没有应答,selete方法将返回0,因为在通道上的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论