JDK1.4非阻塞套接字API概述 - 编程入门网
.next();
// Remove the current key
i.remove();
// if isAccetable = true
// then a client required a connection
if (key.isAcceptable()) {
// get client socket channel
SocketChannel client = server.accept();
// Non Blocking I/O
client.configureBlocking(false);
// recording to the selector (reading)
client.register(selector, SelectionKey.OP_READ);
continue;
}
// if isReadable = true
// then the server is ready to read
if (key.isReadable()) {
SocketChannel client = (SocketChannel) key.channel();
// Read byte coming from the client
int BUFFER_SIZE = 32;
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
try {
client.read(buffer);
}
catch (Exception e) {
// client is no longer active
e.printStackTrace();
continue;
}
// Show bytes on the console
buffer.flip();
Charset charset=Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(buffer);
System.out.print(charBuffer.toString());
continue;
}
}
}
循环的第一行是调用select方法,它会阻塞进程执行并等待选择器上记录的事件。在这段代码中,套接字通道由服务器变量指代。实际上,服务器端不是一个SocketChannel对象,但是一个ServerSocketChannel对象。它象SocketChannel一样是SelectableChannel类的一般化,通常用于服务器端的应用程序。 选择器等待的事件是客户端尝试连接。当这样的操作出现时,服务器端的应用程序便获得一个由选择器创建的关键字和检查每个关键字的类型。你也许注意到,当一个关键字被处理时,它不得不调用remove方法从这组关键字中被移出。如果这个关键字的类型是可接受的(isAcceptable()=true),那么服务器端便通过调用accept方法来查找客户端套接字通道,设置它为非阻隔,并将OP_READ选项把它登记进选择器中。我们也可以使用OP_WRITE 或者是OP_READ|OP_WRITE选项,但为了简单,我实现的服务器端仅仅能从通道中读取,不能进入写入操作。 客户端套接字通道现在已经登记入选择器并可进行读取操作。从而,当客户端在套接字通道上写数据时,选择器将通知服务器端应用程序这里有一些数据读。随着可读关键字的创建,从而isReadable()=true。在这个例子中,应用程序从套接字通道上读取数据使用的是32个字节的ByteBuffer,字节译码使用的是ISO-8859-1编码规则,同时读取的数据也会显示在服务器端的控制台上。 JDK1.4非阻塞套接字API概述(5)时间:2010-12-10客户端非阻隔(Client Nonblocking) 为了检验编制的服务器端能否以非阻隔的方法工作正常,我将实现一个客户端以在套接字通道上连续的写字符串“Client XXX”,这里的“XXX”是命令行所传递的参数。例如,当客户端运行的命令行的参数是89时,服务器端的控制台上就会显示“Client 89 Client 89 Client 89 Client 89 ...”。如果其它的客户端开始的参数是92时会发生些什么呢?如果服务器端已阻隔,任何事情都不会发生;服务器端还是显示连续的字符串“Client 89”。自从我们的服务器使用了非阻隔套接字,那么控制台就会显示下面这样的字符串:"Client 89 Client 89 Client 92 Client 89 Client 92 Client 92 Client 89 Client 89 ...",这意味着在套接字通道上的读/写操作并不阻塞服务器应用程序的执行。 这里有一段客户端应用程序的代码:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |