成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

1. 自動選擇IP

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

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

這是最常用的構造方法,在前面的例子中就是使用的這個構造方法。在使用時只需要提供一個字符串類型的IP或域名以及一個整型的端口號即可。在這個構造方法中可能會拋出兩個錯誤:UnknownHostException和IOException。發生***個錯誤的原因是我們提供的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連接服務器時,可能會發生兩個錯誤,但使用InetAddress對象來描述host,只會發生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參數。如果這個stream為true,那么這個構造方法和***種構造方法完全一樣。如果stream為false,則使用UDP協議建立一個UDP連接(UDP將在下面的章節詳細討論,在這里只要知道它和TCP***的區別是UDP是面向無連接的,而TCP是面向有連接的),也許是當初Sun的開發人員在編寫Socket類時還未考慮編寫處理UDP連接的DatagramSocket類,所以才將建立UDP連接的功能加入到Socket類中,不過Sun在后來的JDK中加入了DatagramSocket類,所以,這個構造方法就沒什么用了,因此,Sun將其設為了Deprecated標記,也就是說,這個構造方法在以后的JDK版本中可以會被刪除。其于以上原因,在使用Java編寫網絡程序時,盡量不要使用這個構造方法來建立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里,無論是否出錯,都會執行這些代碼。但要注意,在關閉Socket連接之前,必須檢查Socket對象是否為null,這是因為錯誤很可能在建立連接時發生,這樣Socket對象就沒有建立成功,也就用不著關閉了。
  

2.手動綁定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的值設為0,java將在1024到65,535之間隨即選擇一個未綁定的端口號。因此,在一般情況下將localPort設為0。

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

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

在下面的代碼中將使用這兩個構造方法來做一個實驗。我們假設有兩臺計算機:PC1和PC2。PC1和PC2各有一塊網卡。PC1綁定有兩個IP:192.168.18.252和200.200.200.200。PC2綁定有一個IP:200.200.200.4。PC1和PC2的子網掩碼都是255.255.255.0。而PC1的默認網關為: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已經連接成功,而socket3并未連接成功。從例程4-8可以看出,socket1在連接時使用localAddress1綁定到了200.200.200.200上,而PC2的IP是200.200.200.4,因此,socket1所使用的IP和PC2的IP在同一個網段,所以socket1可以連接成功。如果將localAddress1改成localAddress2后,socket1將無法連接成功。另外兩個Socket連接socket2和socket3是通過Internet連接www.ptpress.com.cn。它們所不同的是socket2綁定的是192.168.18.252,而socket3綁定的是200.200.200.200。它們執行的結果是socket2可以連接成功,而socket3連接失敗。這是因為socket2所綁定的IP和PC1的默認網關192.168.18.254在同一個網段,因此,socket2可以連接到Internet。而socket3所綁定的IP和PC1的IP不在同一個網段,因此,socket3將無法連接到Internet。

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

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

1. public void connect(SocketAddress endpoint) throws IOException

Socket類的connect方法和它的構造方法在描述服務器信息(IP和端口)上有一些差異。在connect方法中并未象構造方法中以字符串形式的host和整數形式的port作為參數,而是直接將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參數。這個參數表示連接的超時時間,單位是毫秒。使用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將產生一個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實用開發全集
  2. Java開發者盛宴:JavaOne 2009技術前瞻
  3. 實戰Java多線程編程之不提倡的方法
  4. Flex連接Java EE的技術選擇
  5. 高手Java核心技術學習筆記
責任編輯:張燕妮 來源: blogjava
相關推薦

2015-02-12 14:49:36

CGToast狀態欄提示Status

2019-03-27 14:41:41

Python數據庫Windows

2009-07-17 15:34:37

Java Swing連接數據庫

2021-07-22 23:40:15

數字人民幣支付寶微信

2013-04-23 10:09:35

云計算亞馬遜混合云

2010-10-12 12:00:42

MySQL連接

2009-07-16 11:04:17

Jython連接數據庫

2009-07-06 17:23:34

JDBC連接數據庫

2011-03-16 17:14:17

JavaBean數據庫

2010-05-25 18:21:28

MySQL連接數據庫

2011-04-18 09:29:40

數據庫連接數

2009-08-18 11:23:11

2018-01-04 10:43:43

OracleMysqlJava

2011-08-16 18:40:59

SQL Server 數據庫引擎

2009-03-19 10:08:09

C#數據庫查詢

2009-07-20 15:56:08

JDBC連接數據庫步驟

2010-08-04 10:32:56

Flex連接數據庫

2009-07-14 17:18:23

JDBC怎么連接數據庫

2009-08-25 14:05:06

C#連接數據庫代碼

2011-07-05 09:54:04

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 理伦毛片| 午夜视频网站 | 中文字幕久久精品 | 亚洲一区二区三区在线播放 | 成人二区 | 亚洲成人精品视频 | 亚洲欧美在线视频 | 亚洲精品中文字幕 | 日韩精品在线看 | 亚洲福利一区 | 综合国产第二页 | 91精品国产综合久久国产大片 | 日韩不卡一区二区 | 粉嫩国产精品一区二区在线观看 | 成年人国产在线观看 | 亚洲欧美激情视频 | 国产精品国产精品国产专区不片 | 国产高清在线精品一区二区三区 | 国产精品69久久久久水密桃 | 精品欧美一区免费观看α√ | 免费观看的黄色网址 | 久久成人人人人精品欧 | 日本不卡一区二区三区 | 毛片国产 | 日本天堂视频在线观看 | 久久久久一区二区三区 | 中文字幕二区 | 精品久久精品 | 日韩精品在线一区 | 国产激情三区 | 成年人在线播放 | 99久久婷婷国产综合精品 | 日本一区二区三区在线观看 | 久草影视在线 | 色就干 | 久久久久久毛片免费观看 | 亚洲精品福利视频 | 午夜在线小视频 | 亚洲综合无码一区二区 | 久久久久久久国产 | 毛片一级黄色 |