Java网络编程从入门到精通(32):一个非阻塞I/O的例子
Java网络编程从入门到精通(32):一个非阻塞I/O的例子

为了使读者更好地理解非阻塞I/O 本节给出了一个简单的例子用来演示如何将非阻塞I/O应用到网络程序中 读者可以先不必管这个例子的具体细节 因为这个例子的主要目的并不是讲解非阻塞I/O的使用 而是先让读者对非阻塞I/O有一个笼统的感性认识 在看完这个例子后 读者可能会有很多疑问 在本章后面的部分将会逐渐揭开这些迷团 这个例子的主要功能是访问新浪网 并将新浪网的首页在控制台上输出
package test;import *;import java nio *;import java nio channels *;import java io *;public class FirstNonBlockingIO{ public static void main(String[] args) throws Exception { SocketAddress remote = new InetSocketAddress( ); SocketChannel channel = SocketChannel open(remote); String request = GET / HTTP/ rn + Host:rn + Connection:closernrn ; ByteBuffer header = ByteBuffer wrap(request getBytes()); channel write(header); ByteBuffer buffer = ByteBuffer allocate( ); WritableByteChannel out = Channels newChannel(System out); while (channel read(buffer) != ) { buffer flip(); out write(buffer); buffer clear(); } channel close(); }}
测试
执行如下命令
java test FirstNonBlockingIO > sina txt
打开sina txt后 会看到如下的文件内容
HTTP/ OKDate: Sun Apr : : GMTServer: Apache/ (Unix)Last Modified: Sun Apr : : GMTConnection: close </body></>
由于新浪网的主页内容太多 因此 为了方便查看程序运行结果 使用输出重定向符 > 将本该输出到控制台的内容输出到sina txt文件中 从例程 可以看出 主要有三点和同步I/O存在差异
连接服务器(第 行) 使用SocketChannel类 而不是Socket类
向服务端写数据(第 行) 使用SocketChannel类中的write方法 而不是OutputStream
从服务端读数据(第 行) 使用SocketChannel类中的read方法 而不是InputStream
lishixinzhi/Article/program/Java/hx/201311/26564