自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java網(wǎng)絡編程 多種多樣的連接數(shù)據(jù)庫的方式

開發(fā) 后端
我們可以通過6個重載構造函數(shù)以不同的方式來連接服務器。這6個重載的構造函數(shù)可以分為兩類:自動選擇IP和手動綁定IP。

一、通過構造方法連接服務器

我們可以通過6個重載構造函數(shù)以不同的方式來連接服務器。這6個重載的構造函數(shù)可以分為兩類:

1. 自動選擇IP

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

  1. <!--[if !supportLists]-->(1)  
  2.    <!--[endif]-->public Socket(String host, int port)   

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

public Socket(String host, int port) throws UnknownHostException, IOException

(2) public Socket(InetAddress inetaddress, int port)

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

public Socket(InetAddress inetaddress, int port) throws IOException

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

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

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

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

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

  1.       package mysocket;  
  2.  
  3. import java.net.*;  
  4. import java.io.*;  
  5.  
  6. public class MoreConnection  
  7. {  
  8.     private static void closeSocket(Socket socket)  
  9.     {  
  10.         if (socket != null)  
  11.             try  
  12.             {  
  13.                 socket.close();  
  14.             }  
  15.             catch (Exception e) { }  
  16.     }  
  17.  
  18.     public static void main(String[] args)  
  19.     {  
  20.         Socket socket1 = nullsocket2 = nullsocket3 = nullsocket4 = null;  
  21.         try  
  22.         {  
  23.             // 如果將www.ptpress.com.cn改成其它不存在的域名,  
  24.                將拋出UnknownHostException錯誤  
  25.             // 測試public Socket(String host, int port)  
  26.             socket1 = new Socket("www.ptpress.com.cn", 80);  
  27.             System.out.println("socket1連接成功!");  
  28.             // 測試public Socket(InetAddress inetaddress, int port)  
  29.             socket2 = new Socket(InetAddress.getByName("www.ptpress.com.cn"), 80);  
  30.             System.out.println("socket2連接成功!");  
  31.  
  32.             // 下面的兩種建立連接的方式并不建議使用  
  33.             // 測試public Socket(String host, int port, boolean stream)  
  34.             socket3 = new Socket("www.ptpress.com.cn", 80, false);  
  35.             System.out.println("socket3連接成功!");  
  36.             // 測試public Socket(InetAddress inetaddress, int i, boolean flag)  
  37.             socket4 = new Socket(InetAddress.getByName("www.ptpress.com.cn"), 80, false);  
  38.             System.out.println("socket4連接成功!");  
  39.         }  
  40.         catch (UnknownHostException e)  
  41.         {  
  42.             System.out.println("UnknownHostException 被拋出!");  
  43.         }  
  44.         catch (IOException e)  
  45.         {  
  46.             System.out.println("IOException 被拋出!");  
  47.         }  
  48.         finally  
  49.         {  
  50.             closeSocket(socket1);  
  51.             closeSocket(socket2);  
  52.             closeSocket(socket3);  
  53.             closeSocket(socket4);  
  54.         }  
  55.     }  
  56. }   

#p#

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

2.手動綁定IP

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

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

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

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

這個構造方法和***個構造方法基本相同,只是將***個參數(shù)host換成了inetaddress。其它的使用方法和***個構造方法類似。

在下面的代碼中將使用這兩個構造方法來做一個實驗。我們假設有兩臺計算機:PC1和PC2。PC1和PC2各有一塊網(wǎng)卡。PC1綁定有兩個IP:192.168.18.252和200.200.200.200。PC2綁定有一個IP:200.200.200.4。PC1和PC2的子網(wǎng)掩碼都是255.255.255.0。而PC1的默認網(wǎng)關為:192.168.28.254。下面的代碼需要在PC1上運行。                  

  1. package mysocket;  
  2.  
  3. import java.net.*;  
  4.  
  5. public class MoreConnection1  
  6. {  
  7.     public static void main(String[] args)  
  8.     {  
  9.         try  
  10.         {  
  11.             InetAddress localAddress1 = InetAddress.getByName("200.200.200.200");  
  12.             InetAddress localAddress2 = InetAddress.getByName("192.168.18.252");  
  13.             // 如果將localAddress1改成localAddress2,socket1無法連接成功  
  14.             Socket socket1 = new Socket("200.200.200.4", 80, localAddress1, 0);  
  15.             System.out.println("socket1連接成功!");  
  16.             Socket socket2 = new Socket("www.ptpress.com.cn", 80, localAddress2, 0);  
  17.             System.out.println("socket2連接成功!");  
  18.             // 下面的語句將拋出一個IOException錯誤  
  19.             Socket socket3 = new Socket("www.ptpress.com.cn", 80, localAddress1, 0);  
  20.             System.out.println("socket3連接成功!");  
  21.             socket1.close();  
  22.             socket2.close();  
  23.             socket3.close();  
  24.         }  
  25.         catch (Exception e)  
  26.         {  
  27.             System.out.println(e.getMessage());  
  28.         }  
  29.     }  
  30. }   
  31.  

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

socket1連接成功!

socket2連接成功!

Connection timed out: connect

從上面的輸出結果可以看出,socket1和socket2已經(jīng)連接成功,而socket3并未連接成功。從例程4-8可以看出,socket1在連接時使用localAddress1綁定到了200.200.200.200上,而PC2的IP是200.200.200.4,因此,socket1所使用的IP和PC2的IP在同一個網(wǎng)段,所以socket1可以連接成功。如果將localAddress1改成localAddress2后,socket1將無法連接成功。另外兩個Socket連接socket2和socket3是通過Internet連接www.ptpress.com.cn。它們所不同的是socket2綁定的是192.168.18.252,而socket3綁定的是200.200.200.200。它們執(zhí)行的結果是socket2可以連接成功,而socket3連接失敗。這是因為socket2所綁定的IP和PC1的默認網(wǎng)關192.168.18.254在同一個網(wǎng)段,因此,socket2可以連接到Internet。而socket3所綁定的IP和PC1的IP不在同一個網(wǎng)段,因此,socket3將無法連接到Internet。

二、通過connect方法連接服務器

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

1. public void connect(SocketAddress endpoint) throws IOException

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

Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port));

2. public void connect(SocketAddress endpoint, int timeout) throws IOException

這個connect方法和***個connect類似,只是多了一個timeout參數(shù)。這個參數(shù)表示連接的超時時間,單位是毫秒。使用timeout設為0,則使用默認的超時時間。

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

  1.  package mysocket;  
  2.  
  3. import java.net.*;  
  4.  
  5. public class MoreConnection2  
  6. {  
  7.     public static void main(String[] args)  
  8.     {  
  9.         try  
  10.         {  
  11.             Socket socket1 = new Socket();  
  12.             Socket socket2 = new Socket();  
  13.             Socket socket3 = new Socket();  
  14.             socket1.connect(new InetSocketAddress("200.200.200.4", 80));  
  15.             socket1.close();  
  16.             System.out.println("socket1連接成功!");               
  17.             /*  
  18.                將socket2綁定到192.168.18.252將產(chǎn)生一個IOException錯誤    
  19.             socket2.bind(new InetSocketAddress("192.168.18.252", 0));  
  20.             */  
  21.             socket2.bind(new InetSocketAddress("200.200.200.200", 0));  
  22.             socket2.connect(new InetSocketAddress("200.200.200.4", 80));  
  23.                
  24.             socket2.close();  
  25.             System.out.println("socket2連接成功!");  
  26.  
  27.             socket3.bind(new InetSocketAddress("192.168.18.252", 0));  
  28.             socket3.connect(new InetSocketAddress("200.200.200.4", 80),  
  29.                              2000);              
  30.             socket3.close();  
  31.             System.out.println("socket3連接成功!");  
  32.         }  
  33.         catch (Exception e)  
  34.         {  
  35.             System.out.println(e.getMessage());  
  36.         }  
  37.     }  
  38. }   
  39.  

上面的代碼的輸出結果為:               

socket1連接成功!

socket2連接成功!
Connection timed out: connect

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

【編輯推薦】

  1. 專題:Java實用開發(fā)全集
  2. Java開發(fā)者盛宴:JavaOne 2009技術前瞻
  3. 實戰(zhàn)Java多線程編程之不提倡的方法
  4. Flex連接Java EE的技術選擇
  5. 高手Java核心技術學習筆記
責任編輯:張燕妮 來源: blogjava
相關推薦

2015-02-12 14:49:36

CGToast狀態(tài)欄提示Status

2019-03-27 14:41:41

Python數(shù)據(jù)庫Windows

2009-07-17 15:34:37

Java Swing連接數(shù)據(jù)庫

2021-07-22 23:40:15

數(shù)字人民幣支付寶微信

2010-10-12 12:00:42

MySQL連接

2013-04-23 10:09:35

云計算亞馬遜混合云

2009-07-16 11:04:17

Jython連接數(shù)據(jù)庫

2009-07-06 17:23:34

JDBC連接數(shù)據(jù)庫

2011-03-16 17:14:17

JavaBean數(shù)據(jù)庫

2010-05-25 18:21:28

MySQL連接數(shù)據(jù)庫

2011-04-18 09:29:40

數(shù)據(jù)庫連接數(shù)

2009-08-18 11:23:11

2018-01-04 10:43:43

OracleMysqlJava

2009-03-19 10:08:09

C#數(shù)據(jù)庫查詢

2011-08-16 18:40:59

SQL Server 數(shù)據(jù)庫引擎

2011-07-05 09:54:04

2009-08-25 14:05:06

C#連接數(shù)據(jù)庫代碼

2009-07-14 17:18:23

JDBC怎么連接數(shù)據(jù)庫

2009-07-20 15:56:08

JDBC連接數(shù)據(jù)庫步驟

2010-08-04 10:32:56

Flex連接數(shù)據(jù)庫
點贊
收藏

51CTO技術棧公眾號