13.2 網絡編程技術
前面介紹了網絡編程的相關基礎知識,初步建立了網絡編程的概念,但是實際學習網絡編程還必須使用某種程序設計語言進行代碼實現,下面就介紹一下網絡編程的代碼實現。
13.2.1 網絡編程步驟
按照前面的基礎知識介紹,無論使用TCP方式還是UDP方式進行網絡通訊,網絡編程都是由客戶端和服務器端組成。當然,B/S結構的編程中只需要實現服務器端即可。所以,下面介紹網絡編程的步驟時,均以C/S結構為基礎進行介紹。
說明:這裡的步驟實現和語言無關,也就是說,這個步驟適用於各種語言實現,不局限於Java語言。
13.2.1.1 客戶端網絡編程步驟
客戶端(Client)是指網絡編程中首先發起連接的程序,客戶端一般實現程序界面和基本邏輯實現,在進行實際的客戶端編程時,無論客戶端復雜還是簡單,以及客戶端實現的方式,客戶端的編程主要由三個步驟實現:
1、建立網絡連接
客戶端網絡編程的第一步都是建立網絡連接。在建立網絡連接時需要指定連接到的服務器的IP地址和端口號,建立完成以後,會形成一條虛擬的連接,後續的操作就可以通過該連接實現數據交換了。
2、交換數據
連接建立以後,就可以通過這個連接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到服務器,服務器反饋一個響應數據給客戶端,如果客戶端不發送請求則服務器端就不響應。
根據邏輯需要,可以多次交換數據,但是還是必須遵循請求響應模型。
3、關閉網絡連接
在數據交換完成以後,關閉網絡連接,釋放程序占用的端口、內存等系統資源,結束網絡編程。
最基本的步驟一般都是這三個步驟,在實際實現時,步驟2會出現重復,在進行代碼組織時,由於網絡編程是比較耗時的操作,所以一般開啟專門的現場進行網絡通訊。
13.2.1.2 服務器端網絡編程步驟
服務器端(Server)是指在網絡編程中被動等待連接的程序,服務器端一般實現程序的核心邏輯以及數據存儲等核心功能。服務器端的編程步驟和客戶端不同,是由四個步驟實現,依次是:
1、監聽端口
服務器端屬於被動等待連接,所以服務器端啟動以後,不需要發起連接,而只需要監聽本地計算機的某個固定端口即可。
這個端口就是服務器端開放給客戶端的端口,服務器端程序運行的本地計算機的IP地址就是服務器端程序的IP地址。
2、獲得連接
當客戶端連接到服務器端時,服務器端就可以獲得一個連接,這個連接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也通過該連接進行數據交換。
一般在服務器端編程中,當獲得連接時,需要開啟專門的線程處理該連接,每個連接都由獨立的線程實現。
3、交換數據
服務器端通過獲得的連接進行數據交換。服務器端的數據交換步驟是首先接收客戶端發送過來的數據,然後進行邏輯處理,再把處理以後的結果數據發送給客戶端。簡單來說,就是先接收再發送,這個和客戶端的數據交換數序不同。
其實,服務器端獲得的連接和客戶端連接是一樣的,只是數據交換的步驟不同。
當然,服務器端的數據交換也是可以多次進行的。
在數據交換完成以後,關閉和客戶端的連接。
4、關閉連接
當服務器程序關閉時,需要關閉服務器端,通過關閉服務器端使得服務器監聽的端口以及占用的內存可以釋放出來,實現了連接的關閉。
其實服務器端編程的模型和呼叫中心的實現是類似的,例如移動的客服電話10086就是典型的呼叫中心,當一個用戶撥打10086時,轉接給一個專門的客服人員,由該客服實現和該用戶的問題解決,當另外一個用戶撥打10086時,則轉接給另一個客服,實現問題解決,依次類推。
在服務器端編程時,10086這個電話號碼就類似於服務器端的端口號碼,每個用戶就相當於一個客戶端程序,每個客服人員就相當於服務器端啟動的專門和客戶端連接的線程,每個線程都是獨立進行交互的。
這就是服務器端編程的模型,只是TCP方式是需要建立連接的,對於服務器端的壓力比較大,而UDP是不需要建立連接的,對於服務器端的壓力比較小罷了。
13.2.1.3 小結
總之,無論使用任何語言,任何方式進行基礎的網絡編程,都必須遵循固定的步驟進行操作,在熟悉了這些步驟以後,可以根據需要進行邏輯上的處理,但是還是必須遵循固定的步驟進行。
其實,基礎的網絡編程本身不難,也不需要很多的基礎網絡知識,只是由於編程的基礎功能都已經由API實現,而且需要按照固定的步驟進行,所以在入門時有一定的門檻,希望下面的內容能夠將你快速的帶入網絡編程技術的大門。
13.2.2 Java網絡編程技術
Java語言是在網絡環境下誕生的,所以Java語言雖然不能說是對於網絡編程的支持最好的語言,但是必須說是一種對於網絡編程提供良好支持的語言,使用Java語言進行網絡編程將是一件比較輕松的工作。
和網絡編程有關的基本API位於java.net包中,該包中包含了基本的網絡編程實現,該包是網絡編程的基礎。該包中既包含基礎的網絡編程類,也包含封裝後的專門處理WEB相關的處理類。在本章中,將只介紹基礎的網絡編程類。
首先來介紹一個基礎的網絡類——InetAddress類。該類的功能是代表一個IP地址,並且將IP地址和域名相關的操作方法包含在該類的內部。
關於該類的使用,下面通過一個基礎的代碼示例演示該類的使用,代碼如下:
package inetaddressdemo;
import java.net.*;
/**
* 演示InetAddress類的基本使用
*/
public class InetAddressDemo {
public static void main(String[] args) {
try{
//使用域名創建對象
InetAddress inet1 = InetAddress.getByName("www.163.com");
System.out.println(inet1);
//使用IP創建對象
InetAddress inet2 = InetAddress.getByName("127.0.0.1");
System.out.println(inet2);
//獲得本機地址對象
InetAddress inet3 = InetAddress.getLocalHost();
System.out.println(inet3);
//獲得對象中存儲的域名
String host = inet3.getHostName();
System.out.println("域名:" + host);
//獲得對象中存儲的IP
String ip = inet3.getHostAddress();
System.out.println("IP:" + ip);
}catch(Exception e){}
}
}
在該示例代碼中,演示了InetAddress類的基本使用,並使用了該類中的幾個常用方法,該代碼的執行結果是:
www.163.com/220.181.28.50
/127.0.0.1
chen/192.168.1.100
域名:chen
IP:192.168.1.100
說明:由於該代碼中包含一個互聯網的網址,所以運行該程序時需要聯網,否則將產生異常。
在後續的使用中,經常包含需要使用InetAddress對象代表IP地址的構造方法,當然,該類的使用不是必須的,也可以使用字符串來代表IP地址進行實現。