天天看點

Java網絡程式設計從入門到精通(32):一個非阻塞I/O的例子

本文為原創,如需轉載,請注明作者和出處,謝謝!

為了使讀者更好地了解非阻塞I/O,本節給出了一個簡單的例子用來示範如何将非阻塞I/O應用到網絡程式中。讀者可以先不必管這個例子的具體細節。因為這個例子的主要目的并不是講解非阻塞I/O的使用,而是先讓讀者對非阻塞I/O有一個籠統的感性認識。在看完這個例子後,讀者可能會有很多疑問,在本章後面的部分将會逐漸揭開這些迷團。這個例子的主要功能是通路新浪網,并将新浪網的首頁在控制台上輸出。

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();

    }

}

測試

   執行如下指令:

java test.FirstNonBlockingIO > sina.txt

  打開sina.txt後,會看到如下的檔案内容:

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

Java網絡程式設計從入門到精通(32):一個非阻塞I/O的例子
Java網絡程式設計從入門到精通(32):一個非阻塞I/O的例子
Java網絡程式設計從入門到精通(32):一個非阻塞I/O的例子
Java網絡程式設計從入門到精通(32):一個非阻塞I/O的例子

</body>

</html>

    由于新浪網的首頁内容太多,是以,為了友善檢視程式運作結果,使用輸出重定向符“>”将本該輸出到控制台的内容輸出到sina.txt檔案中。從例程7-1可以看出,主要有三點和同步I/O存在差異。

1.  連接配接伺服器(第013行)。使用SocketChannel類,而不是Socket類。

2.  向服務端寫資料(第018行)。 使用SocketChannel類中的write方法,而不是OutputStream。

3.  從服務端讀資料(第021行)。使用SocketChannel類中的read方法,而不是InputStream。

   除了上面的三點外,在本例中還使用了緩沖區來處理輸入輸出資料。是以,通道(Channels)和緩沖區(Buffers)是學習非阻塞I/O之前必須掌握的知識。在下面的文章等将詳細講解這兩部分的内容。

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>