快速业务通道

JDK1.4非阻塞套接字API概述 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
新的套接字。SocketChannel类被定义在java.nio.channel包中。

选择器是一个Selector类的对象。该类的每个实例均能监视更多的套接字通道,进而建立更多的连接。当一些有意义的事发生在通道上(如客户端试图连接服务器端或进行读/写操作),选择器便会通知应用程序处理请求。选择器会创建一个关键字,这个关键字是SelectionKey类的一个实例。每个关键字都保存着应用程序的标识及请求的类型。其中,请求的类型可以是如下之一:

●尝试连接(客户端)

●尝试连接(服务器端)

●读取操作

●写入操作

一个通用的实现非阻隔服务器的算法如下:

create SocketChannel; create Selector associate the SocketChannel to the Selector for(;;) { waiting events from the Selector; event arrived; create keys; for each key created by Selector { check the type of request; isAcceptable: get the client SocketChannel; associate that SocketChannel to the Selector; record it for read/write operations continue; isReadable: get the client SocketChannel; read from the socket; continue; isWriteable: get the client SocketChannel; write on the socket; continue; } }

基本上,服务器端的实现是由选择器等待事件和创建关键字的无限循环组成的。根据关键字的类型,及时的执行操作。关键字存在以下4种可能的类型。

Acceptable: 相应的客户端要求连接。

Connectable:服务器端接受连接。

Readable:服务器端可读。

Writeable:服务器端可写。

JDK1.4非阻塞套接字API概述(4)

时间:2010-12-10

通常一个表示接受的关键字创建在服务器端。事实上,这种关键字仅仅通知一下服务器端客户端请求连接。在这种环境下,正如你通过算法得到的结论一样,服务器端个性化套接字通道和连接这个通道到选择器以便进行读/写操作。从这一刻起,当接受客户端读或写操作时,选择器将为客户端创建Readable或Writeable关键字。从而,服务器端将截取这些关键字并执行正确的动作。

现在,你可以用下面这个推荐算法和Java语言写服务器端了。用这种方法能成功的创建套接字通道,选择器,和套接字-选择器注册(socket-selector registration)。

// Create the server socket channel ServerSocketChannel server = ServerSocketChannel.open(); // nonblocking I/O server.configureBlocking(false); // host-port 8000 server.socket().bind(new java.net.InetSocketAddress(host,8000)); System.out.println("Server attivo porta 8000"); // Create the selector Selector selector = Selector.open(); // Recording server to selector (type OP_ACCEPT) server.register(selector,SelectionKey.OP_ACCEPT);

这个静态(static)open类方法创建了一个SocketChannel类的实例。configureBlocking(false)调用设置通道为非阻隔。通过bind方法建立到服务器端的连接。字符串“host”代表服务器的IP地址,8000是通信套接字。你可以调用你可以调用Selector类的静态(static)open方法创建选择器。最后,register方法用来连接选择器和套接字通道。

第二个参数代表注册的类型。在这个例子中,我们使用OP_ACCEPT,意思是选择器仅能报告客户端试图尝试连接服务器端。其他可能的选项是:OP_CONNECT,在客户端下使用;OP_READ; 和OP_WRITE

用Java语言描述的无限for循环的代码如下:

// Infinite server loop for(;;) { // Waiting for events selector.select(); // Get keys Set keys = selector.selectedKeys(); Iterator i = keys.iterator(); // For each keys... while(i.hasNext()) { SelectionKey key = (SelectionKey) i

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号