java中 java.net 包分析


對於socket的編程一直是懵懂的狀態,最近正好有心情,也有強烈看一遍java.net包的想法,正好借此機會詳細了解一下java.net包

java.net 包中共有8個接口,38個實現類(其中包括抽象類)

 

下面是jdk 1.6(中文版本)對於java.net的描述

軟件包 java.net 的描述
為實現網絡應用程序提供類。

java.net 包可以大致分為兩個部分:

低級 API,用於處理以下抽象:

地址,也就是網絡標識符,如 IP 地址。

套接字,也就是基本雙向數據通信機制。

接口,用於描述網絡接口。

高級 API,用於處理以下抽象:

URI,表示統一資源標識符。

URL,表示統一資源定位符。

連接,表示到 URL 所指向資源的連接。

地址
在整個 java.net API 中,地址或者用作主機標識符或者用作套接字端點標識符。

InetAddress 類是表示 IP(Internet 協議)地址的抽象。它擁有兩個子類:

用於 IPv4 地址的 Inet4Address。
用於 IPv6 地址的 Inet6Address。
但是,在大多數情況下,不必直接處理子類,因為 InetAddress 抽象應該覆蓋大多數必需的功能。

關於 IPv6
並非所有系統都支持 IPv6 協議,而當 Java 網絡連接堆棧嘗試檢測它並在可用時透明地使用它時,還可以利用系統屬性禁用它。在 IPv6 不可用或被顯式禁用的情況下,Inet6Address 對大多數網絡連接操作都不再是有效參數。雖然可以保證在查找主機名時 java.net.InetAddress.getByName 之類的方法不返回 Inet6Address,但仍然可能通過傳遞字面值來創建此類對象。在此情況下,大多數方法在使用 Inet6Address 調用時都將拋出異常。

套接字
套接字是在網絡上建立機器之間的通信鏈接的方法。java.net 包提供 4 種套接字:

Socket 是 TCP 客戶端 API,通常用於連接遠程主機。
ServerSocket 是 TCP 服務器 API,通常接受源於客戶端套接字的連接。
DatagramSocket 是 UDP 端點 API,用於發送和接收數據包
MulticastSocket 是 DatagramSocket 的子類,在處理多播組時使用。
使用 TCP 套接字的發送和接收操作需要借助 InputStream 和 OutputStream 來完成,這兩者是通過 Socket.getInputStream() 和 Socket.getOutputStream() 方法獲取的。

接口
NetworkInterface 類提供 API 以瀏覽和查詢本地機器的所有網絡接口(例如,以太網連接或 PPP 端點)。只有通過該類才可以檢查是否將所有本地接口都配置為支持 IPv6。

高級 API
java.net 包中的許多類可以提供更加高級的抽象,允許方便地訪問網絡上的資源。這些類為:

URI 是表示在 RFC 2396 中指定的統一資料標識符的類。顧名思義,它只是一個標識符,不直接提供訪問資源的方法。
URL 是表示統一資源定位符的類,它既是 URI 的舊式概念又是訪問資源的方法。
URLConnection 是根據 URL 創建的,是用於訪問 URL 所指向資源的通信鏈接。此抽象類將大多數工作委托給底層協議處理程序,如 http 或 ftp。
HttpURLConnection 是 URLConnection 的子類,提供一些特定於 HTTP 協議的附加功能。
建議的用法是使用 URI 指定資源,然后在訪問資源時將其轉換為 URL。從該 URL 可以獲取 URLConnection 以進行良好控制,也可以直接獲取 InputStream。

下面是一個示例:

URI uri = new URI("http://java.sun.com/");
URL url = uri.toURL();
InputStream in = url.openStream();

協議處理程序
如上所述,URL 和 URLConnection 都依賴於協議處理程序,所以協議處理程序必須存在;否則將拋出異常。此為與 URI 的主要不同點,URI 僅標識資源,所以不必訪問協議處理程序。因此,盡管可能利用任何種類的協議方案(例如, myproto://myhost.mydomain/resource/)創建 URI,但類似的 URL 仍將試圖實例化指定協議的處理程序;如果指定協議的處理程序不存在,則拋出異常。
默認情況下,協議處理程序從默認位置動態加載。但是,通過設置 java.protocol.handler.pkgs 系統屬性也可能增加搜索路徑。例如,如果將其設置為 myapp.protocols,則 URL 代碼將首先嘗試(對於 http 而言)加載 myapp.protocols.http.Handler,然后,如果失敗,則嘗試從默認位置加載 http.Handler。

注意,處理程序類必須為抽象類 URLStreamHandler 的子類。

 

上面的描述中,總體結構確實很清晰,但是細節還要自己去看,而且很多內容聽起來還是很懵懂。

下面來看地址的描述,地址沒有抽象出來接口,其中有 個類是用來描述地址,他們的UML關系如下

大部分的地址描述也不是很清楚,目前主要是使用的還是InetAddress類

  • InetAddress:此類表示互聯網協議 (IP) 地址。
  • Inet4Address:此類表示 Internet Protocol version 4 (IPv4) 地址。
  • Inet6Address:此類表示互聯網協議第 6 版 (IPv6) 地址。
  • SocketAddress:此類表示不帶任何協議附件的 Socket Address。作為一個抽象類,應通過特定的、協議相關的實現為其創建子類。
  • InetSocketAddress:此類實現 IP 套接字地址(IP 地址 + 端口號)。它還可以是一個對(主機名 + 端口號),在此情況下,將嘗試解析主機名。如果解析失敗,則該地址將被視為未解析 地址,但是其在某些情形下仍然可以使用,比如通過代理連接。

它提供不可變對象,供套接字用於綁定、連接或用作返回值。

  • InterfaceAddress:此類表示網絡接口地址。簡言之,對於 IPv4 地址,是指 IP 地址、子網掩碼和廣播地址。對於 IPv6 地址,是指 IP 地址和網絡前綴長度。

 

套接字(socket) 和socket相關的接口有3個,實現類有6個,UDP的socket還提供了 1 個數據包封裝的類,UML關系圖如下

 

  • SocketImplFactory:(接口)此接口定義用於套接字實現的工廠。Socket 和 ServerSocket 類使用它來創建實際的套接字實現。
  • DatagramSocketImplFactory:(接口)此接口定義用於數據報套接字實現的工廠。DatagramSocket 類使用它來創建實際的套接字實現。
  • SocketOptions:(接口)獲取/設置套接字選項的方法的接口。此接口由 SocketImpl 和 DatagramSocketImpl 實現。它們的子類應該重寫此接口的方法來支持它們自己的選項
  • SocketImpl:(抽象)抽象類 SocketImpl 是實際實現套接字的所有類的通用超類。創建客戶端和服務器套接字都可以使用它。
  • DatagramSocketImpl:數據報和多播套接字實現的抽象基類。
  • Socket:此類實現客戶端套接字(也可以就叫“套接字”)。套接字是兩台機器間通信的端點。
  • ServerSocket:此類實現服務器套接字。服務器套接字等待請求通過網絡傳入。它基於該請求執行某些操作,然后可能向請求者返回結果。
  • DatagramSocket:此類表示用來發送和接收數據報包的套接字。
  • DatagramPacket:此類表示數據報包。
  • MulticastSocket:多播數據報套接字類用於發送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機的“組”的附加功能。

 

接口(我也不知道這是干嘛的,這里提供了一個類,具體怎么用,什么時候用不清楚)這里只有 1 個類

NetworkInterface:此類表示一個由名稱和分配給此接口的 IP 地址列表組成的網絡接口。它用於標識加入多播組的本地接口。 接口通常是按名稱(如 "le0")區分的


上面就是低級API提供部分,重點就時Tcp連接的Socket/ServerSocket 和 UDP的DatagramSocket(使用DatagramPacket發送內容),創建了3個接口 6+6+1+1 = 14個類。
下面是java.net 包下高級APi提供的內容
UPI(表示一個統一資源標識符 (URI) 引用)
其包目錄下就提供一個類 URI類,創建了 1 個類。

 

 
 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM