熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

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

2022-06-13   來源: Java核心技術 

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

   package test;

import *;
import javanio*;
import javaniochannels*;
import javaio*;

public class FirstNonBlockingIO
{
    public static void main(String[] args) throws Exception
    {
        SocketAddress remote = new InetSocketAddress( );
        SocketChannel channel = SocketChannelopen(remote);
        String request = GET / HTTP/\r\n + 
                         Host:\r\n +
                         Connection:close\r\n\r\n;
        ByteBuffer header = ByteBufferwrap(requestgetBytes());
        channelwrite(header);        
        ByteBuffer buffer = ByteBufferallocate();
        WritableByteChannel out = ChannelsnewChannel(Systemout);
        while (channelread(buffer) != )
        {
            bufferflip();
            outwrite(buffer);
            bufferclear();
        }
        channelclose();
    }
}

  測試

  執行如下命令

   java testFirstNonBlockingIO > sinatxt

  打開sinatxt後會看到如下的文件內容

   HTTP/  OK
Date: Sun  Apr  :: GMT
Server: Apache/ (Unix)
LastModified: Sun  Apr  :: GMT
Connection: close
 
 
</body>
</html>

  由於新浪網的主頁內容太多因此為了方便查看程序運行結果使用輸出重定向符>將本該輸出到控制台的內容輸出到sinatxt文件中從例程可以看出主要有三點和同步I/O存在差異

    連接服務器(第行)使用SocketChannel類而不是Socket類

    向服務端寫數據(第行) 使用SocketChannel類中的write方法而不是OutputStream

    從服務端讀數據(第行)使用SocketChannel類中的read方法而不是InputStream

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


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26564.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.