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

進階教程——Java網絡編程

2013-11-23 19:03:48  來源: Java核心技術 

  Java最初是作為一種網絡編程語言出現的它能夠使用網絡上的各種資源和數據與服務器建立各種傳輸通道將自己的數據傳送到網絡的各個地方你可以用Java很輕松地完成這些因為Java類庫提供了很強大的網絡功能
  
  本章主要介紹如下內容
  
  Java網絡類和接口
  
  InetAddress類
  
  URL和URLConnection類
  
  TCP/IP服務器與客戶端套接字
  
  Datagram套接字
  
  Java網絡類和接口
  Java中有關網絡方面的功能都定義在程序包中Java所提供的網絡功能可大致分為三大類
  
  URL和URLConnection 這是三大類功能中最高級的一種通過URL的網絡資源表達方式很容易確定網絡上數據的位置利用URL的表示和建立Java程序可以直接讀入網絡上所放的數據或把自己的數據傳送到網絡的另一端
  
  Socket 所謂Socket可以想像成兩個不同的程序通過網絡的通道而這是傳統網絡程序中最常用的方法一般在TCP/IP網絡協議下的客戶服務器軟件采用Socket作為交互的方式
  
  Datagram 是這些功能中最低級的一種其他網絡數據傳送方式都假想在程序執行時建立一條安全穩定的通道但是以Datagram的方式傳送數據時只是把數據的目的地記錄在數據包中然後就直接放在網絡上進行傳輸系統不保證數據一定能夠安全送到也不能確定什麼時候可以送到也就是說Datagram不能保證傳送質量
  
  InetAddress類
  InetAddress類是Java的IP地址封裝類它不需要用戶了解如何實現地址的細節該類的定義如下
  public final class InetAddress extends object implements Serializable
  
  該類裡有兩個字段hostName(String)和address(int)即主機名和IP地址這兩個字段是不公開的我們不能直接訪問它們
  
  下面我們介紹InetAddress類提供的Internet地址的操作
  
   創建InetAddress對象的方法
  
  InetAddress類沒有構造方法要創建該類的實例對象可以通過該類的靜態方法獲得該對象這些靜態方法如下
  
  public static InetAddress getLocalHost()
  
  方法getLocalHost()獲得本地機的InetAddress對象當查找不到本地機器的地址時觸發一個UnknownHostException異常示范代碼如下
  
  try {
  InetAddress address=InetAddressgetLocalHost( );
  …;   // 其他處理代碼
  }
  catch(UnknownException e) {
  …; // 異常處理代碼
  }
  
  public static InetAddress getByName (String host)
  
  方法getByName(String host)獲得由host指定的InetAddress對象host是計算機的域名(也就是名字)其作用跟IP地址一樣只不過域名標識計算機比IP標識計算機更易於記憶如果找不到主機會觸發UnknownHostException異常示范代碼如下
  
  try {
  InetAddress address=InetAddressgetByName( host );
  …;   // 其他處理代碼
  }
  catch(UnknownException e) {
  … // 異常處理代碼
  }
  
  public static InetAddress[] getAllByName(String host)
  
  我們知道在Internet上不允許多台計算機共用一個名字(或者說是IP地址)但是在Web中可以用相同的名字代表一組計算機通過方法InetAddress[]getAllByName(String host)可以獲得具有相同名字的一組InetAddress對象出錯了同樣會拋出UnknownException異常示范代碼如下
  
  try {
  InetAddress address=InetAddressgetAllByName( host );
  …;  // 其他處理代碼
  }
  catch(UnknownException e) {
  … // 異常處理代碼
  }
  
   實例查詢IP地址的版本
  
  InteAddress類有一個getAddress()方法該方法將IP地址以網絡字節順序作為字節數組返回當前IP只有個字節但是當實行IPV就有個字節了如果需要知道數組的長度可以用數組的length字段使用getAddress( )方法的一般性用法如下所示
  
  InetAddress inetaddress=InetAddressgetLocalHost( );
  byte[ ] address=inetaddressgetAddress( );
  
  我們要注意的是返回的byte[ ]字節是無符號的但是Java沒有無符號字節的基本數據類型因此如果要對返回的字節操作時必須要將int做適當的調整下面的方法就實現了這個目的
  int unsignbyte = signbyte < ? signbyte + : signbyte;
  
  如果signbyte是負數就加使其成為正數否則就保持不變
  下面的程序示例可以查詢IP地址是IPV還是IPV還能查詢IP的類別
  【程序源代碼】
  
   // ==================== Program Description ==================
   // 程序名稱示例: IPVersionjava
   // 程序目的查詢IP的版本熟悉InetAddress用法
   // ======================================================
   import *;
   import javaio*;
  
   public class IPVersion
   {
     public static void main(String args[])
     {
   try
   {
   InetAddress inetadd=InetAddressgetLocalHost();
   byte[ ] address=inetaddgetAddress( );
   if (addresslength==)
   {
           Systemoutprintln(The ip version is ipv);
   int firstbyte=address[];
   if (firstbyte<)
    firstbyte += ;
    if((firstbyte&x)== )
    Systemoutprintln(the ip class is A);
    else if ((firstbyte&xC)==x )
    Systemoutprintln(The ip class is B);
    else if((firstbyte&xE)==xC )
  
     Systemoutprintln(The ip class is C);
           else if((firstbyte&xF)==xE)
             Systemoutprintln(The ip class is D);
             else if((firstbyte&xF)==xF )
              Systemoutprintln(The ip class is E);
   }
   else if(addresslength==)
   Systemoutprintln(The ip version is ipv);
      }
      catch (Exception e)
      { };
     }
   }
  
  
  【程序輸出結果】
  
  The ip version is ipv
  The ip class is C
  
  【程序注解】
  在第行用getLocalHost()方法得到本地的InetAddress對象inetadd然後調用getAddress()方法返回IP字節數組如果是個字節的就是IPV如果是個字節的就是IPV最後我們就可以根據第一個字節數判斷網絡類型如果第一字節的形式是*******則這個地址就是A類地址以表判定可以得到BCDE類地址
  
  表 判斷網絡類型的位串
  類 高 位 串
  A ……
  B ……
  C ……
  D ……
  E ……
  
  筆者所用主機的IP地址是C類地址所以程序的輸出結果為The ip class is C如果運行該程序的主機的IP地址為其他類型輸出結果會隨之改變
  
  下面我們再介紹InetAddress類的另外兩個方法
  
  public String getHostName()
  getHostName()方法返回一個字符串就是主機名字如果被查詢的機器沒有主機名或者如果使用了Applet但是它的安全性卻禁止查詢主機名則該方法就返回一個具有點分形式的數字IP地址一般的使用方法如下所示
  
  InetAddress inetadd = InetAddressgetLocalHost( );
  String localname= inetaddgetHostName( );
  
  public String toString()
  toSring()方法得到主機名和IP地址的字符串其具體形式如下主機名/點分地址
  
  如果一個InetAddress對象沒有主機名則點分格式的IP地址將會被代替
  
  下面的程序示例就綜合使用了getHostName( )和tostring( )方法
  【程序源代碼】
  
   // ==================== Program Description ==================
   // 程序名稱示例: Internetjava
   // 程序目的熟悉getHostName( )和tostring( )方法
   // ==============================================================
   import *;
   import javaio*;
  
   class Internet
   {
   public static void main(String args[])
     {
     try {
       InetAddress inetadd;
        inetadd=InetAddressgetLocalHost();
        System out println(hostname=+inetaddgetHostName());
        System out println(inetaddtoString() );
       }
       catch(Exception e) {
        Systemoutprintln(e);
       }
     }
   }
  
  【程序輸出結果】
  
  D:\java project>java internet

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26214.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.