隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

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

          本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

          上一篇:Java網(wǎng)絡(luò)編程從入門到精通(31):非阻塞I/O簡介

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

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

          測試

             執(zhí)行如下命令:

          java test.FirstNonBlockingIO > sina.txt


            打開sina.txt后,會看到如下的文件內(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)的主頁內(nèi)容太多,因此,為了方便查看程序運行結(jié)果,使用輸出重定向符“>”將本該輸出到控制臺的內(nèi)容輸出到sina.txt文件中。從例程7-1可以看出,主要有三點和同步I/O存在差異。

          1.  連接服務(wù)器(第013行)。使用SocketChannel類,而不是Socket類。
          2.  向服務(wù)端寫數(shù)據(jù)(第018行)。 使用SocketChannel類中的write方法,而不是OutputStream。
          3.  從服務(wù)端讀數(shù)據(jù)(第021行)。使用SocketChannel類中的read方法,而不是InputStream。

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

          下一篇:Java網(wǎng)絡(luò)編程從入門到精通(33):非阻塞I/O的緩沖區(qū)(Buffer)





          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-08-21 09:08 銀河使者 閱讀(3038) 評論(3)  編輯  收藏 所屬分類: java 原創(chuàng)網(wǎng)絡(luò)編程

          評論

          # re: Java網(wǎng)絡(luò)編程從入門到精通(32):一個非阻塞I/O的例子   回復  更多評論   

          支持一下
          2009-08-21 09:21 | 長生界

          # re: Java網(wǎng)絡(luò)編程從入門到精通(32):一個非阻塞I/O的例子   回復  更多評論   

          頂一下!
          2009-08-21 17:42 | 樂蜂網(wǎng)

          # re: Java網(wǎng)絡(luò)編程從入門到精通(32):一個非阻塞I/O的例子   回復  更多評論   

          Java樂園學習網(wǎng)站: http://www.javaly.cn

          有大量的學習文章和視頻教程,以及一些項目源碼

          Java樂園學習群: 81107233
          2009-08-25 08:52 | 找個美女做老婆
          主站蜘蛛池模板: 韶山市| 长宁县| 高碑店市| 当雄县| 新丰县| 虹口区| 时尚| 嘉祥县| 东乌| 东宁县| 中山市| 双柏县| 绿春县| 保定市| 鱼台县| 南宁市| 麻城市| 梁山县| 池州市| 抚远县| 元谋县| 耒阳市| 宿迁市| 台南县| 开阳县| 丰城市| 通海县| 安福县| 麻阳| 来凤县| 延庆县| 汉寿县| 深州市| 泸定县| 左权县| 宜阳县| 清新县| 宕昌县| 健康| 建平县| 宁化县|