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

Java網絡編程 多種多樣的連接數據庫的方式

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


  通過構造方法連接服務器

    我們可以通過個重載構造函數以不同的方式來連接服務器個重載的構造函數可以分為兩類

   自動選擇IP

  這種方式是最常用的所謂自動選擇IP是指當本機有多塊網卡或者在一個網卡上綁定了多個IP時Socket類會自動為我們選擇一個可用的IP在上述個構造方法中有個是使用這種方法來連接服務器的

   <![if !supportLists]>()
   <![endif]>public Socket(String host int port)

  這是最常用的構造方法在前面的例子中就是使用的這個構造方法在使用時只需要提供一個字符串類型的IP或域名以及一個整型的端口號即可在這個構造方法中可能會拋出兩個錯誤UnknownHostException和IOException發生第一個錯誤的原因是我們提供的host並不存在或不合法而其它的錯誤被歸為IO錯誤因此這個構造方法的完整定義是

  public Socket(String host int port) throws UnknownHostException IOException

  () public Socket(InetAddress inetaddress int port)

  這個構造方法和第一種構造方法類似只是將字符串形式的host改為InetAddress對象類型了在這個構造方法中之所以要使用InetAddress類主要是因為考慮到在程序中可能需要使用Socket類多次連接同一個IP或域名這樣使用InetAddress類的效率比較高另外在使用字符串類型的host連接服務器時可能會發生兩個錯誤但使用InetAddress對象來描述host只會發生IOException錯誤這是因為當你將IP或域名傳給InetAddress時InetAddress會自動檢查這個IP或域名如果這個IP或域名無效那麼InetAddress就會拋出UnknownHostException錯誤而不會由Socket類的構造方法拋出因此這個構造方法的完整定義是

   public Socket(InetAddress inetaddress int port) throws IOException

  () public Socket(String host int port boolean stream)

  這個構造方法和第一種構造方法差不多只是多了一個boolean類型的stream參數如果這個stream為true那麼這個構造方法和第一種構造方法完全一樣如果stream為false則使用UDP協議建立一個UDP連接(UDP將在下面的章節詳細討論在這裡只要知道它和TCP最大的區別是UDP是面向無連接的而TCP是面向有連接的)也許是當初Sun的開發人員在編寫Socket類時還未考慮編寫處理UDP連接的DatagramSocket類所以才將建立UDP連接的功能加入到Socket類中不過Sun在後來的JDK中加入了DatagramSocket類所以這個構造方法就沒什麼用了因此Sun將其設為了Deprecated標記也就是說這個構造方法在以後的JDK版本中可以會被刪除其於以上原因在使用Java編寫網絡程序時盡量不要使用這個構造方法來建立UDP連接

  () public Socket(InetAddress inetaddress int port boolean flag)

  這個構造方法和第三種構造方法的flag標記的含義一樣也是不建議使用的

  下面的代碼演示上述種構造方法的使用

   package mysocket;

import *;
import javaio*;

public class MoreConnection
{
    private static void closeSocket(Socket socket)
    {
        if (socket != null)
            try
            {
                socketclose();
            }
            catch (Exception e) { }
    }

public static void main(String[] args)
    {
        Socket socket = null socket = null socket = null socket = null;
        try
        {
            // 如果將改成其它不存在的域名
               將拋出UnknownHostException錯誤
            // 測試public Socket(String host int port)
            socket = new Socket( );
            Systemoutprintln(socket連接成功!);
            // 測試public Socket(InetAddress inetaddress int port)
            socket = new Socket(InetAddressgetByName() );
            Systemoutprintln(socket連接成功!);

// 下面的兩種建立連接的方式並不建議使用
            // 測試public Socket(String host int port boolean stream)
            socket = new Socket( false);
            Systemoutprintln(socket連接成功!);
            // 測試public Socket(InetAddress inetaddress int i boolean flag)
            socket = new Socket(InetAddressgetByName() false);
            Systemoutprintln(socket連接成功!);
        }
        catch (UnknownHostException e)
        {
            Systemoutprintln(UnknownHostException 被拋出!);
        }
        catch (IOException e)
        {
            Systemoutprintln(IOException 被拋出!);
        }
        finally
        {
            closeSocket(socket);
            closeSocket(socket);
            closeSocket(socket);
            closeSocket(socket);
        }
    }
}

  在上面代碼中的最後通過finally關閉了被打開的Socket連接這是一個好習慣因為只有在將關閉Socket連接的代碼寫在finally裡無論是否出錯都會執行這些代碼但要注意在關閉Socket連接之前必須檢查Socket對象是否為null這是因為錯誤很可能在建立連接時發生這樣Socket對象就沒有建立成功也就用不著關閉了

  手動綁定IP

  當本機有多個IP時(這些IP可能是多塊網卡上的也可能是一塊網卡上綁定的多個IP)在連接服務器時需要由客戶端確定需要使用哪個IP這樣就必須使用Socket類的另外兩個構方法來處理下面讓我們來看看這兩個構造方法是如何來使用特定的IP來連接服務器的

  public Socket(String host int port InetAddress inetaddress int localPort)

  這個構造方法的參數分為兩部分第一部分為前兩個參數host和port它們分別表示要連接的服務器的IP和端口號第二部分為後兩個參數inetaddress和localPort其中inetaddress則表示要使用的本地的IP而localPort則表示要綁定的本地端口號這個localPort這以設置為本機的任何未被綁定的端口號如果將localPort的值設為java將在之間隨即選擇一個未綁定的端口號因此在一般情況下將localPort設為

  public Socket(InetAddress inetaddress int port InetAddress inetaddress int localPort)

  這個構造方法和第一個構造方法基本相同只是將第一個參數host換成了inetaddress其它的使用方法和第一個構造方法類似

  在下面的代碼中將使用這兩個構造方法來做一個實驗我們假設有兩台計算機PC和PCPC和PC各有一塊網卡PC綁定有兩個IPPC綁定有一個IPPC和PC的子網掩碼都是而PC的默認網關為下面的代碼需要在PC上運行

   package mysocket;

import *;

public class MoreConnection
{
    public static void main(String[] args)
    {
        try
        {
            InetAddress localAddress = InetAddressgetByName();
            InetAddress localAddress = InetAddressgetByName();
            // 如果將localAddress改成localAddresssocket無法連接成功
            Socket socket = new Socket( localAddress );
            Systemoutprintln(socket連接成功!);
            Socket socket = new Socket( localAddress );
            Systemoutprintln(socket連接成功!);
            // 下面的語句將拋出一個IOException錯誤
            Socket socket = new Socket( localAddress );
            Systemoutprintln(socket連接成功!);
            socketclose();
            socketclose();
            socketclose();
        }
        catch (Exception e)
        {
            Systemoutprintln(egetMessage());
        }
    }
}

  運行上面代碼的輸出結果如下

  socket連接成功!

  socket連接成功!

  Connection timed out connect

  從上面的輸出結果可以看出socket和socket已經連接成功而socket並未連接成功從例程可以看出socket在連接時使用localAddress綁定到了而PC的IP是因此socket所使用的IP和PC的IP在同一個網段所以socket可以連接成功如果將localAddress改成localAddresssocket將無法連接成功另外兩個Socket連接socket和socket是通過Internet連接它們所不同的是socket綁定的是而socket綁定的是它們執行的結果是socket可以連接成功而socket連接失敗這是因為socket所綁定的IP和PC的默認網關在同一個網段因此socket可以連接到Internet而socket所綁定的IP和PC的IP不在同一個網段因此socket將無法連接到Internet

  通過connect方法連接服務器

  Socket類不僅可以通過構造方法直接連接服務器而且還可以建立未連接的Socket對象並通過connect方法來連接服務器Socket類的connect方法有兩個重載形式

   public void connect(SocketAddress endpoint) throws IOException

  Socket類的connect方法和它的構造方法在描述服務器信息(IP和端口)上有一些差異在connect方法中並未象構造方法中以字符串形式的host和整數形式的port作為參數而是直接將IP和端口封裝在了SocketAddress類的子類InetSocketAddress中可按如下形式使用這個connect方法

   Socket socket = new Socket();
nnect(new InetSocketAddress(host port));

   public void connect(SocketAddress endpoint int timeout) throws IOException

  這個connect方法和第一個connect類似只是多了一個timeout參數這個參數表示連接的超時時間單位是毫秒使用timeout設為則使用默認的超時時間

  在使用Socket類的構造方法連接服務器時可以直接通過構造方法綁定本地IP而connect方法可以通過Socket類的bind方法來綁定本地IP例程演示如何使用connect方法和bind方法

   package mysocket;

import *;

public class MoreConnection
{
    public static void main(String[] args)
    {
        try
        {
            Socket socket = new Socket();
            Socket socket = new Socket();
            Socket socket = new Socket();
            nnect(new InetSocketAddress( ));
            socketclose();
            Systemoutprintln(socket連接成功!);            
            /*
               將socket綁定到將產生一個IOException錯誤 
            socketbind(new InetSocketAddress( ));
            */
            socketbind(new InetSocketAddress( ));
            nnect(new InetSocketAddress( ));
            
            socketclose();
            Systemoutprintln(socket連接成功!);

socketbind(new InetSocketAddress( ));
            nnect(new InetSocketAddress( )
                             );           
            socketclose();
            Systemoutprintln(socket連接成功!);
        }
        catch (Exception e)
        {
            Systemoutprintln(egetMessage());
        }
    }
}

  上面的代碼的輸出結果為

  socket連接成功!

  socket連接成功!

  Connection timed out connect

  在上面代碼中的socket連接服務器時為其設置了超時時間(毫秒)因此socket在非常短的時間就拋出了IOException錯誤


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

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