JAVA 是現(xiàn)代網(wǎng)絡(luò)編程中使用的主要編程語(yǔ)言之一。網(wǎng)絡(luò)編程支持不僅是指提供 API 以在兩臺(tái)或多臺(tái)遠(yuǎn)程計(jì)算機(jī)之間建立通信,而且還提供所有必要的手段,即使是新手程序員也可以輕松訪問(wèn)網(wǎng)絡(luò)資源。
Java 中有一個(gè)專門用于此原因的完整包,稱為 java.net 包。到目前為止,網(wǎng)絡(luò)是一個(gè)龐大而復(fù)雜的主題,但在本文中,我們將嘗試從 Java API 的角度探索網(wǎng)絡(luò)編程的一些關(guān)鍵點(diǎn)。
網(wǎng)絡(luò)概述
套接字的概念構(gòu)成了現(xiàn)代網(wǎng)絡(luò)編程的基礎(chǔ),它指的是網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間的通信端點(diǎn)。套接字編程使我們能夠一次在多個(gè)客戶端之間建立通信,通信的信息類型也根據(jù)與套接字一起使用的端口號(hào)而有所不同。因此,一臺(tái)計(jì)算機(jī)不僅可以與多個(gè)客戶端進(jìn)行通信,還可以與多種類型的信息進(jìn)行通信。
在網(wǎng)絡(luò)傳輸過(guò)程中,數(shù)據(jù)被分成更小的塊,稱為數(shù)據(jù)包,然后通過(guò)網(wǎng)絡(luò)發(fā)送到一個(gè)地址。這種通信的規(guī)范稱為路由協(xié)議。網(wǎng)際協(xié)議(IP)是一種將信息傳輸?shù)侥繕?biāo)地址但不保證所述數(shù)據(jù)包將被傳遞的低級(jí)協(xié)議。這意味著根據(jù)該協(xié)議的通信被標(biāo)記為不可靠。還有另一種稱為傳輸控制協(xié)議 (TCP) 的協(xié)議,它是一種高級(jí)協(xié)議,它通過(guò)對(duì)未傳遞的數(shù)據(jù)包進(jìn)行分類和重新傳輸?shù)侥繕?biāo)地址來(lái)以可靠的方式管理數(shù)據(jù)包的傳輸。
因此,該協(xié)議稱為 TCP/IP。該協(xié)議預(yù)留了1024個(gè)端口,用于確定一些高階協(xié)議。為了消除混淆,請(qǐng)注意這些特定協(xié)議決定了傳輸信息的類型,而低級(jí)協(xié)議 (TCP/IP) 只關(guān)心如何通過(guò)將信息調(diào)整為稱為數(shù)據(jù)包的更小塊來(lái)傳輸數(shù)據(jù)的機(jī)制,而無(wú)需關(guān)心它包含的信息類型。
我們熟悉其中許多特定協(xié)議。通常,特定的端口號(hào)由特定的協(xié)議標(biāo)識(shí)。但是,出于安全原因,服務(wù)器管理員可能會(huì)覆蓋此設(shè)置。但是,一般來(lái)說(shuō),它們與端口號(hào)關(guān)聯(lián)如下:文件傳輸協(xié)議或 FTP (21)、Telnet (23)、簡(jiǎn)單郵件傳輸協(xié)議或 SMTP (25)、whois (43)、超文本傳輸協(xié)議或 HTTP ( 80) 等等。在特定端口中接收到的通信決定了客戶端將如何與接收到的數(shù)據(jù)進(jìn)行交互。例如,在端口 80 (HTTP) 中接收到的數(shù)據(jù)意味著只有瀏覽器才能理解;這意味著它包含超文本頁(yè)面和圖像。
最后,網(wǎng)絡(luò)通信的關(guān)鍵組成部分是計(jì)算機(jī)本身的地址,稱為 IP(Internet 協(xié)議)地址。網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)都必須有一臺(tái)。 IPv4(IP 地址版本 4)地址是一個(gè) 32 位值,組織為四個(gè) 8 位值塊。 IP 地址的另一個(gè)最新發(fā)展是 IPv6(版本 6),它使用 8 個(gè) 16 位塊中的 128 位值來(lái)表示一個(gè)地址。一個(gè)比另一個(gè)有幾個(gè)優(yōu)點(diǎn)和缺點(diǎn),但是在編程時(shí),我們不必過(guò)多關(guān)注它們,因?yàn)樗怯?Java 自動(dòng)處理的。
Java中的網(wǎng)絡(luò)
Java 支持 TCP 和 UDP 協(xié)議,其中 TCP 用于跨網(wǎng)絡(luò)的可靠的面向連接、基于流的 I/O,而 UDP 用于快速、不可靠的點(diǎn)對(duì)點(diǎn)數(shù)據(jù)報(bào)連接。與 UDP 相關(guān)的標(biāo)簽“不可靠性”有點(diǎn)輕描淡寫。在實(shí)踐中,通過(guò) UDP 傳輸數(shù)據(jù)是相當(dāng)可靠的,只有在通信高度強(qiáng)調(diào)絕對(duì)可靠性時(shí)才應(yīng)該放棄使用這種模型。除此之外,UDP 在大多數(shù)情況下都非常有效,應(yīng)出于所有實(shí)際原因使用。
Java URI 類
Java 有另一個(gè)類,稱為 URI(統(tǒng)一資源標(biāo)識(shí)符)。 URI 是標(biāo)識(shí)資源的標(biāo)準(zhǔn)方法。它類似于 URL 類;實(shí)際上,URL 是 URI 類的一個(gè)子集。從概念上講,除了標(biāo)識(shí) URI 所用的資源之外,URL 還使我們能夠定位資源。這意味著所有的 URL 都是 URI,但反之則不然。因此,有了這個(gè)想法,在 Java 中選擇合適的類是不是很困難?無(wú)法決定選擇什么 - URI 或 URL?沒(méi)有更多的困惑。
Java 提供了諸如 HttpCookie、CookieManager、CookieHandler 之類的類,以及諸如 CookiePolicy 和 CookieStore 之類的接口來(lái)處理有狀態(tài)的 HTTP 會(huì)話,所有這些都在 java.net 包中。這些類在我們通常創(chuàng)建 HTTP 會(huì)話的 Servlet 和 JSP 工作時(shí)非常方便。
在 Java 中創(chuàng)建 TCP 客戶端和服務(wù)器
在 Internet 上的主機(jī)之間創(chuàng)建雙向、可靠、點(diǎn)對(duì)點(diǎn)、基于流的連接的最簡(jiǎn)單方法是實(shí)現(xiàn) TCP 套接字,Java 提供了從頭開(kāi)始實(shí)現(xiàn)的所有必要方法。
在 Java 中創(chuàng)建 UDP 客戶端和服務(wù)器
Java 通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)報(bào)的方式是通過(guò) UDP 協(xié)議。它可以稱為 TCP 網(wǎng)絡(luò)上的輕量級(jí)數(shù)據(jù)傳輸,因?yàn)?TCP 包含大量開(kāi)銷來(lái)保持傳輸?shù)慕∪裕鐡頂D網(wǎng)絡(luò)的擁塞控制、丟包導(dǎo)致的數(shù)據(jù)包重傳策略等。這些使其成為維護(hù)主機(jī)之間連接的繁重且昂貴的方式。從這個(gè)意義上說(shuō),數(shù)據(jù)報(bào)雖然是一種不可靠的傳輸策略,但它是輕量級(jí)的,一旦通過(guò)網(wǎng)絡(luò)發(fā)送,它就不會(huì)關(guān)心數(shù)據(jù)包的丟失。有時(shí)這種粗心的策略正是我們所需要的,而不是選擇繁重的 TCP 連接。
結(jié)論
java.net 包中還有許多其他類。這幾個(gè)可能是處理與在 Java 中實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用程序相關(guān)的任何事情的基本類。但是,請(qǐng)注意,開(kāi)發(fā)人員的真正優(yōu)勢(shì)在于其將網(wǎng)絡(luò)作為一門學(xué)科的概念基礎(chǔ),而不是任何編程語(yǔ)言。話雖如此,值得一提的是,Java 使啟動(dòng)網(wǎng)絡(luò)編程變得容易,即使對(duì)于初出茅廬的程序員也是如此。在 Java 誕生之初,人們認(rèn)為它是一種用于 Internet 編程的語(yǔ)言。這樣的概念當(dāng)然有一些價(jià)值,因?yàn)槲覀兛梢钥吹剿谶@方面提供的 API 支持的擴(kuò)展。