java網絡編程【精簡篇】

網絡編程


    網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。程序員所作的事情就是把數據發送到指定的位置,或者接收到指定的數據,這個就是狹義的網絡編程範疇。在發送和接收數據時,大部分的程序設計語言都設計了專門的API實現這些功能,程序員只需要調用即可。

    通過借鑑大神所寫,感覺很有用。點擊打開鏈接

一、計算機網絡概述

1、概述

網絡編程的實質就是兩個(或多個)設備(例如計算機)之間的數據傳輸。

對於網絡編程來說,最主要的是計算機和計算機之間的通信,這樣首要的問題就是如何找到網絡上的計算機呢?這就需要了解IP地址的概念。

2、TCP/IP協議 、Internet地址、URL(統一資源定位符) 

IP地址,形如xxx.xxx.xxx.xxx 

域名系統。例如www.edu.cn 

協議 :// 主機 [: 端口] [/ 文件] [# 引用]

詳細解釋:

(1)、爲了能夠方便的識別網絡上的每個設備,網絡中的每個設備都會有一個唯一的數字標識,這個就是IP地址。在計算機網絡中,現在命名IP地址的規定是IPv4協議,該協議規定每個IP地址由40-255之間的數字組成,例如10.0.120.34。每個接入網絡的計算機都擁有唯一的IP地址,這個IP地址可能是固定的,例如網絡上各種各樣的服務器,也可以是動態的,例如使用ADSL撥號上網的寬帶用戶,無論以何種方式獲得或是否是固定的,每個計算機在聯網以後都擁有一個唯一的合法IP地址,就像每個手機號碼一樣。

(2)、但是由於IP地址不容易記憶,所以爲了方便記憶,有創造了另外一個概念——域名(Domain Name),例如sohu.com等。一個IP地址可以對應多個域名,一個域名只能對應一個IP地址。域名的概念可以類比手機中的通訊簿,由於手機號碼不方便記憶,所以添加一個姓名標識號碼,在實際撥打電話時可以選擇該姓名,然後撥打即可。

(3)、在網絡中傳輸的數據,全部是以IP地址作爲地址標識,所以在實際傳輸數據以前需要將域名轉換爲IP地址,實現這種功能的服務器稱之爲DNS服務器,也就是通俗的說法叫做域名解析。例如當用戶在瀏覽器輸入域名時,瀏覽器首先請求DNS服務器,將域名轉換爲IP地址,然後將轉換後的IP地址反饋給瀏覽器,然後再進行實際的數據傳輸。

    當DNS服務器正常工作時,使用IP地址或域名都可以很方便的找到計算機網絡中的某個設備,例如服務器計算機。當DNS不正常工作時,只能通過IP地址訪問該設備。所以IP地址的使用要比域名通用一些。

(4)、 IP地址和域名很好的解決了在網絡中找到一個計算機的問題,但是爲了讓一個計算機可以同時運行多個網絡程序,就引入了另外一個概念——端口(port) 在介紹端口的概念以前,首先來看一個例子,一般一個公司前臺會有一個電話,每個員工會有一個分機,這樣如果需要找到這個員工的話,需要首先撥打前臺總機,然後轉該分機號即可。這樣減少了公司的開銷,也方便了每個員工。在該示例中前臺總機的電話號碼就相當於IP地址,而每個員工的分機號就相當於端口。

    有了端口的概念以後,在同一個計算機中每個程序對應唯一的端口,這樣一個計算機上就可以通過端口區分發送給每個端口的數據了,換句話說,也就是一個計算機上可以併發運行多個網絡程序,而不會在互相之間產生干擾。

    在硬件上規定,端口的號碼必須位於0-65535之間,每個端口唯一的對應一個網絡程序,一個網絡程序可以使用多個端口。這樣一個網絡程序運行在一臺計算上時,不管是客戶端還是服務器,都是至少佔用一個端口進行網絡通訊。在接收數據時,首先發送給對應的計算機,然後計算機根據端口把數據轉發給對應的程序。(爲了避免與計算機上的必要端口衝突,建議在練習時,端口號儘量大於1024)

    有了IP地址和端口的概念以後,在進行網絡通訊交換時,就可以通過IP地址查找到該臺計算機,然後通過端口標識這臺計算機上的一個唯一的程序。這樣就可以進行網絡數據的交換了。

(5) 網絡編程就是運行在不同計算機中兩個程序之間的數據交換。在實際進行數據交換時,爲了讓接收端理解該數據,計算機比較笨,什麼都不懂的,那麼就需要規定該數據的格式,

這個數據的格式就是——協議(Protocol)

 在實際的網絡程序編程中,最麻煩的內容不是數據的發送和接收,因爲這個功能在幾乎所有的程序語言中都提供了封裝好的API進行調用,最麻煩的內容就是協議的設計以及協議的生產和解析,這個纔是網絡編程中最核心的內容。

例: 瀏覽器的請求

<span style="font-size:14px;">GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 192.168.31.169:9090
DNT: 1
Connection: Keep-Alive</span>
請求行,包含:  請求方式(GET或POST) 空格 請求的資源路徑 空格 http的協議版本
接下來是請求消息頭(...)
空行
請求體(包括瀏覽器向服務器提交的表單數據等)


<span style="font-size:14px;">HTTP/1.1 200 OK
Date: Fri, 11 Sep 2015 12:33:43 GMT
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Set-Cookie: JSESSIONID=409C8CF8220AD78D26D47B15DCEADCD3; Path=/; HttpOnly
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Language: zh-CN</span>
應答行,包含:http協議版本 空格 應答狀態碼 空格 應答狀態碼信息碼描述
應答消息頭(...)
空行
應答體(頁面內容)

3、客戶-服務器(Client-Server)模式 和 瀏覽器-服務端(Browse/Server)模式

 在網絡通訊中,第一次主動發起通訊的程序被稱作客戶端(Client)程序,簡稱客戶端,而在第一次通訊中等待連接的程序被稱作服務器端(Server)程序,簡稱服務器。一旦通訊建立,則客戶端和服務器端完全一樣,沒有本質的區別。

1)概念

C/S:網絡編程中的兩種程序就分別是客戶端和服務器端,例如QQ程序,每個QQ用戶安裝的都是QQ客戶端程序,而QQ服務器端程序則運行在騰訊公司的機房中,爲大量的QQ用戶提供服務。這種網絡編程的結構被稱作客戶端/服務器結構,也叫做Client/Server結構,簡稱C/S結構。

B/S:在運行很多程序時,沒有必要使用專用的客戶端,而需要使用通用的客戶端,例如瀏覽器,使用瀏覽器作爲客戶端的結構被稱作瀏覽器/服務器結構,也叫做Browser/Server結構,簡稱爲B/S結構。

2)特點

c/s:a、客戶端和服務端的軟件都需要程序員進行編寫。

b、客戶端維護起來較爲麻煩。

c、客戶端的存在可以將一部分運算分離到客戶端來運行,減輕了服務器端的壓力。

b/s:a、客戶端不用程序員編寫,直接使用系統中具備的瀏覽器軟件作爲客戶端即可。程序員只需要填寫服務器端就OK了。

b、維護起來也很容易,因爲只要維護服務器即可。

c、所有的運算都在服務器端,相對壓力較大。


二、網絡模型與通訊要素 

1、網絡模型

OSI參考模型

TCP/IP參考模型


七層簡述:

1)物理層:主要定義物理設備標準,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉化爲電流強弱來進行傳輸,到達目的

地後再轉化爲1、0,也就是我們常說的數模轉換與模數轉換)。這一層的數據叫做比特。

2)數據鏈路層:主要將從物理層接收的數據進行MAC地址(網卡的地址)的封裝與解封裝。常把這一層的數據叫做幀。在這一層工作的設備是交換機,數據通過交換機來傳輸

3)網絡層:主要將下層接收到的數據進行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的設備是路由器,常把這一層的數據叫做數據包。

4)傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口號80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據),UDP(用戶數

據報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。主要是將從下層接收的數據進行分段和傳輸,到達目的地址

後再進行重組。常常把這一層叫做段。

5)會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數據傳輸的通路。主要在你的系統之間發起會話或者接收會話請求(設備之間需要互相認識可以是IP也可以是MAC或者是主

機名)

6)表示層:主要是進行對接收的數據進行解釋,加密與解密、壓縮與解壓縮等(也就是把計算機能夠識別的東西轉換成人能夠識別的東西(如圖片、聲音等)。

7)應用層:主要是一些終端的應用,比如說FTP(各種文件下載)、WEB(IE瀏覽)、QQ之類的(可以把它理解成我們在電腦屏幕上可以看到的東西,就是終端應用)。

2、網絡通訊要素

IP地址

端口號

傳輸協議

1)IP地址:InetAddress

網絡中設備的標識

不易記憶,可用主機名

本地迴環地址:127.0.0.1  主機名:localhost

2)端口號

用於標識進程的邏輯地址,不同進程的標識

有效端口:0~65535,其中0~1024系統使用或保留端口。

3)傳輸協議

通訊的規則

常見協議:TCP,UDP


三、java網絡編程類

1、網絡資源定位指針——URL類

<span style="font-size:14px;">public final class URL implements Serializable{
  public URL(String protocol, String host, int port, String file) 
                                            throws MalformedURLException
  public String toString()  //返回完整URL地址字符串
  public String getProtocol() //返回協議名
  public int getPort()        //返回端口
  public int getDefaultPort() //返回默認端口
  public String getHost()     //返回主機名
  public String getFile()     //返回完整文件名
  //使用流獲得URL資源內容
  public final InputStream openStream() throws IOException
}</span>
創建:  URL url2 = new URL("http://www.edu.cn");


2、URL的通信鏈接——URLConnection類

<span style="font-size:14px;">public abstract class URLConnection{
  public URL getURL()            //返回當前連接的URL對象
  public int getContentLength()  //返回資源文件的長度
  public String getContentType() //返回資源文件的類型
  public long getLastModified()  //返回資源文件的最後修改日期
}</span>
URL類的openConnection()方法可創建一個URLConnection對象

<span style="font-size:14px;">public URLConnection openConnection()  throws IOException</span>


3、互聯網協議(IP)地址——InetAddress類

<span style="font-size:14px;">public class InetAddress implements Serializable{
  public static InetAddress getByName(String host)
  public static InetAddress getByAddress(String host, byte[] addr)
  public static InetAddress getLocalHost() //返回本地主機
  public String getHostAddress()   //返回IP地址字符串
  public String getHostName()     //返回主機名
}</span>

例:

//使用域名創建對象
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);

四、網絡編程步驟

1、客戶端網絡編程步驟

客戶端(Client)是指網絡編程中首先發起連接的程序,客戶端一般實現程序界面和基本邏輯實現,在進行實際的客戶端編程時,無論客戶端複雜還是簡單,以及客戶端實現的方式,客戶端的編程主要由三個步驟實現:

1) 建立網絡連接

客戶端網絡編程的第一步都是建立網絡連接。在建立網絡連接時需要指定連接到的服務器的IP地址和端口號,建立完成以後,會形成一條虛擬的連接,後續的操作就可以通過該連接實現數據交換了。

2) 交換數據

連接建立以後,就可以通過這個連接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到服務器,服務器反饋一個響應數據給客戶端,如果客戶端不發送請求則服務器端就不響應。

根據邏輯需要,可以多次交換數據,但是還是必須遵循請求響應模型。

3) 關閉網絡連接

在數據交換完成以後,關閉網絡連接,釋放程序佔用的端口、內存等系統資源,結束網絡編程。

         最基本的步驟一般都是這三個步驟,在實際實現時,步驟2會出現重複,在進行代碼組織時,由於網絡編程是比較耗時的操作,所以一般開啓專門的現場進行網絡通訊。


2、服務器端網絡編程步驟

服務器端(Server)是指在網絡編程中被動等待連接的程序,服務器端一般實現程序的核心邏輯以及數據存儲等核心功能。服務器端的編程步驟和客戶端不同,是由四個步驟實現,依次是:

1) 監聽端口

服務器端屬於被動等待連接,所以服務器端啓動以後,不需要發起連接,而只需要監聽本地計算機的某個固定端口即可。

這個端口就是服務器端開放給客戶端的端口,服務器端程序運行的本地計算機的IP地址就是服務器端程序的IP地址。

2) 獲得連接

當客戶端連接到服務器端時,服務器端就可以獲得一個連接,這個連接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也通過該連接進行數據交換。

一般在服務器端編程中,當獲得連接時,需要開啓專門的線程處理該連接,每個連接都由獨立的線程實現。

3) 交換數據

服務器端通過獲得的連接進行數據交換。服務器端的數據交換步驟是首先接收客戶端發送過來的數據,然後進行邏輯處理,再把處理以後的結果數據發送給客戶端。簡單來說,就是先接收再發送,這個和客戶端的數據交換數序不同。

其實,服務器端獲得的連接和客戶端連接是一樣的,只是數據交換的步驟不同。

當然,服務器端的數據交換也是可以多次進行的。

在數據交換完成以後,關閉和客戶端的連接。

4) 關閉連接

當服務器程序關閉時,需要關閉服務器端,通過關閉服務器端使得服務器監聽的端口以及佔用的內存可以釋放出來,實現了連接的關閉。

    其實服務器端編程的模型和呼叫中心的實現是類似的,例如移動的客服電話10086就是典型的呼叫中心,當一個用戶撥打10086時,轉接給一個專門的客服人員,由該客服實現和該用戶的問題解決,當另外一個用戶撥打10086時,則轉接給另一個客服,實現問題解決,依次類推。

 在服務器端編程時,10086這個電話號碼就類似於服務器端的端口號碼,每個用戶就相當於一個客戶端程序,每個客服人員就相當於服務器端啓動的專門和客戶端連接的線程,每個線程都是獨立進行交互的。

         這就是服務器端編程的模型,只是TCP方式是需要建立連接的,對於服務器端的壓力比較大,而UDP是不需要建立連接的,對於服務器端的壓力比較小罷了


五、通訊方式(單獨講解)

1、 TCP(傳輸控制協議)方式

2、 UDP(用戶數據報協議)方式



















發佈了148 篇原創文章 · 獲贊 29 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章