本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!
上一篇:Java網(wǎng)絡(luò)編程從入門(mén)到精通(31):非阻塞I/O簡(jiǎn)介
為了使讀者更好地理解非阻塞I/O,本節(jié)給出了一個(gè)簡(jiǎn)單的例子用來(lái)演示如何將非阻塞I/O應(yīng)用到網(wǎng)絡(luò)程序中。讀者可以先不必管這個(gè)例子的具體細(xì)節(jié)。因?yàn)檫@個(gè)例子的主要目的并不是講解非阻塞I/O的使用,而是先讓讀者對(duì)非阻塞I/O有一個(gè)籠統(tǒng)的感性認(rèn)識(shí)。在看完這個(gè)例子后,讀者可能會(huì)有很多疑問(wèn),在本章后面的部分將會(huì)逐漸揭開(kāi)這些迷團(tuán)。這個(gè)例子的主要功能是訪問(wèn)新浪網(wǎng),并將新浪網(wǎng)的首頁(yè)在控制臺(tái)上輸出。
package test;
import java.net.*;
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("www.sina.com.cn", 80);
SocketChannel channel = SocketChannel.open(remote);
String request = "GET / HTTP/1.1\r\n" +
"Host:www.sina.com.cn\r\n" +
"Connection:close\r\n\r\n";
ByteBuffer header = ByteBuffer.wrap(request.getBytes());
channel.write(header);
ByteBuffer buffer = ByteBuffer.allocate(1024);
WritableByteChannel out = Channels.newChannel(System.out);
while (channel.read(buffer) != -1)
{
buffer.flip();
out.write(buffer);
buffer.clear();
}
channel.close();
}
}
測(cè)試
執(zhí)行如下命令:
java test.FirstNonBlockingIO > sina.txt
打開(kāi)sina.txt后,會(huì)看到如下的文件內(nèi)容:
HTTP/1.0 200 OK
Date: Sun, 01 Apr 2007 06:53:50 GMT
Server: Apache/2.0.58 (Unix)
Last-Modified: Sun, 01 Apr 2007 06:50:47 GMT
Connection: close


</body>
</html>
由于新浪網(wǎng)的主頁(yè)內(nèi)容太多,因此,為了方便查看程序運(yùn)行結(jié)果,使用輸出重定向符“>”將本該輸出到控制臺(tái)的內(nèi)容輸出到sina.txt文件中。從例程7-1可以看出,主要有三點(diǎn)和同步I/O存在差異。
1. 連接服務(wù)器(第013行)。使用SocketChannel類,而不是Socket類。
2. 向服務(wù)端寫(xiě)數(shù)據(jù)(第018行)。 使用SocketChannel類中的write方法,而不是OutputStream。
3. 從服務(wù)端讀數(shù)據(jù)(第021行)。使用SocketChannel類中的read方法,而不是InputStream。
除了上面的三點(diǎn)外,在本例中還使用了緩沖區(qū)來(lái)處理輸入輸出數(shù)據(jù)。因此,通道(Channels)和緩沖區(qū)(Buffers)是學(xué)習(xí)非阻塞I/O之前必須掌握的知識(shí)。在下面的文章等將詳細(xì)講解這兩部分的內(nèi)容。
下一篇:Java網(wǎng)絡(luò)編程從入門(mén)到精通(33):非阻塞I/O的緩沖區(qū)(Buffer)
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining