13.2.5 網絡協議
對於需要從事網絡編程的程序員來說,網絡協議是一個需要深刻理解的概念。那麼什麼是網絡協議呢?
網絡協議是指對於網絡中傳輸的數據格式的規定。對於網絡編程初學者來說,沒有必要深入了解TCP/IP協議簇,所以對於初學者來說去讀大部頭的《TCP/IP協議》也不是一件很合適的事情,因為深入了解TCP/IP協議是網絡編程提高階段,也是深入網絡編程底層時才需要做的事情。
對於一般的網絡編程來說,更多的是關心網絡上傳輸的邏輯數據內容,也就是更多的是應用層上的網絡協議,所以後續的內容均以實際應用的數據為基礎來介紹網絡協議的概念。
那麼什麼是網絡協議呢,下面看一個簡單的例子。春節晚會上“小沈陽”和趙本山合作的小品《不差錢》中,小沈陽和趙本山之間就設計了一個協議,協議的內容為:
如果點的菜價錢比較貴是,就說沒有。
按照該協議的規定,就有了下面的對話:
趙本山:4斤的龍蝦
小沈陽:(經過判斷,得出價格比較高),沒有
趙本山:鮑魚
小沈陽:(經過判斷,得出價格比較高),沒有
這就是一種雙方達成的一種協議約定,其實這種約定的實質和網絡協議的實質是一樣的。網絡協議的實質也是客戶端程序和服務器端程序對於數據的一種約定,只是由於以計算機為基礎,所以更多的是使用數字來代表內容,這樣就顯得比較抽象一些。
下面再舉一個簡單的例子,介紹一些基礎的網絡協議設計的知識。例如需要設計一個簡單的網絡程序:網絡計算器。也就是在客戶端輸入需要計算的數字和運算符,在服務器端實現計算,並將計算的結果反饋給客戶端。在這個例子中,就需要約定兩個數據格式:客戶端發送給服務器端的數據格式,以及服務器端反饋給客戶端的數據格式。
可能你覺得這個比較簡單,例如客戶端輸入的數字依次是12和432,輸入的運算符是加號,可能最容易想到的數據格式是形成字符串“12+432”,這樣格式的確比較容易閱讀,但是服務器端在進行計算時,邏輯就比較麻煩,因為需要首先拆分該字符串,然後才能進行計算,所以可用的數據格式就有了一下幾種:
“12,432,+” 格式為:第一個數字,第二個數字,運算符
“12,+,432” 格式為:第一個數字,運算符,第二個數字
其實以上兩種數據格式很接近,比較容易閱讀,在服務器端收到該數據格式以後,使用“,”為分隔符分割字符串即可。
假設對於運算符再進行一次約定,例如約定數字0代表+,1代表減,2代表乘,3代表除,整體格式遵循以上第一種格式,則上面的數字生產的協議數據為:
“12,432,0”
這就是一種基本的發送的協議約定了。
另外一個需要設計的協議格式就是服務器端反饋的數據格式,其實服務器端主要反饋計算結果,但是在實際接受數據時,有可能存在格式錯誤的情況,這樣就需要簡單的設計一下服務器端反饋的數據格式了。例如規定,如果發送的數據格式正確,則反饋結果,否則反饋字符串“錯誤”。這樣就有了以下的數據格式:
客戶端:“1,111,1” 服務器端:”-110”
客戶端:“123,23,0” 服務器端:“146”
客戶端:“1,2,5” 服務器端:“錯誤”
這樣就設計出了一種最最基本的網絡協議格式,從該示例中可以看出,網絡協議就是一種格式上的約定,可以根據邏輯的需要約定出各種數據格式,在進行設計時一般遵循“簡單、通用、容易解析”的原則進行。
而對於復雜的網絡程序來說,需要傳輸的數據種類和數據量都比較大,這樣只需要依次設計出每種情況下的數據格式即可,例如QQ程序,在該程序中需要進行傳輸的網絡數據種類很多,那麼在設計時就可以遵循:登錄格式、注冊格式、發送消息格式等等,一一進行設計即可。所以對於復雜的網絡程序來說,只是增加了更多的命令格式,在實際設計時的工作量增加不是太大。
不管怎麼說,在網絡編程中,對於同一個網絡程序來說,一般都會涉及到兩個網絡協議格式:客戶端發送數據格式和服務器端反饋數據格式,在實際設計時,需要一一對應。這就是最基本的網絡協議的知識。
網絡協議設計完成以後,在進行網絡編程時,就需要根據設計好的協議格式,在程序中進行對應的編碼了,客戶端程序和服務器端程序需要進行協議處理的代碼分別如下。
客戶端程序需要完成的處理為:
1、客戶端發送協議格式的生成
2、服務器端反饋數據格式的解析
服務器端程序需要完成的處理為:
1、服務器端反饋協議格式的生成
2、客戶端發送協議格式的解析
這裡的生成是指將計算好的數據,轉換成規定的數據格式,這裡的解析指,從反饋的數據格式中拆分出需要的數據。在進行對應的代碼編寫時,嚴格遵循協議約定即可。
所以,對於程序員來說,在進行網絡程序編寫時,需要首先根據邏輯的需要設計網絡協議格式,然後遵循協議格式約定進行協議生成和解析代碼的編寫,最後使用網絡編程技術實現整個網絡編程的功能。
由於各種網絡程序使用不同的協議格式,所以不同網絡程序的客戶端之間無法通用。
而對於常見協議的格式,例如HTTP(Hyper Text Transfer Protocol,超文本傳輸協議)、FTP(File Transfer Protocol,文件傳輸協議),SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)等等,都有通用的規定,具體可以查閱相關的RFC文檔。
最後,對於一種網絡程序來說,網絡協議格式是該程序最核心的技術秘密,因為一旦協議格式洩漏,則任何一個人都可以根據該格式進行客戶端的編寫,這樣將影響服務器端的實現,也容易出現一些其它的影響。
13.2.6小結
關於網絡編程基本的技術就介紹這麼多,該部分介紹了網絡編程的基礎知識,以及Java語言對於網絡編程的支持,網絡編程的步驟等,並詳細介紹了TCP方式網絡編程和UDP方式網絡編程在Java語言中的實現。
網絡協議也是網絡程序的核心,所以在實際開始進行網絡編程時,設計一個良好的協議格式也是必須進行的工作。