網絡編程基礎知識
C/S結構:全稱為Client/Server結構,是指客戶端和服務器結構。常見程序有QQ、迅雷等軟件。
B/S結構:全稱為Browser/Server結構,是指瀏覽器和服務器結構。常見瀏覽器有谷歌、火狐等。
兩種架構各有優勢,但是無論哪種架構,都離不開網絡的支持。網絡編程,就是在一定的協議下,實現兩臺計算機的通信的程序。
TCP/IP協議:傳輸控制協議/因特網互聯協議( Transmission Control Protocol/Internet Protocol),是Internet最基本、最廣泛的協議。
它定義了計算機如何連入因特網,以及數據如何在它們之間傳輸的標準。它的內部包含一系列的用于處理數據通信的協議,
并采用了4層的分層模型,每一層都呼叫它的下一層所提供的協議來完成自己的需求。
TCP/IP協議中的四層分別是應用層、傳輸層、網絡層和鏈路層,每層分別負責不同的通信功能。
鏈路層:鏈路層是用于定義物理傳輸通道,通常是對某些網絡連接設備的驅動協議,例如針對光纖、網線提供的驅動。
網絡層:網絡層是整個TCP/IP協議的核心,它主要用于將傳輸的數據進行分組,將分組數據發送到目標計算機或者網絡。
運輸層:主要使網絡程序進行通信,在進行網絡通信時,可以采用TCP協議,也可以采用UDP協議。
應用層:主要負責應用程序的協議,例如HTTP協議、FTP協議等。
java.net 包中提供了兩種常見的網絡協議的支持:UDP 和 TCP
1. UDP:用戶數據報協議(User Datagram Protocol)。UDP是無連接通信協議,即在數據傳輸時,數據的發送端和接收端不建立邏輯連接。
簡單來說,當一臺計算機向另外一臺計算機發送數據時,發送端不會確認接收端是否存在,就會發出數據,同樣接收端在收到數據時,也不會向發送端反饋是否收到數據。
由于使用UDP協議消耗資源小,通信效率高,所以通常都會用于音頻、視頻和普通數據的傳輸例如視頻會議都使用UDP協議,因為這種情況即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。
但是在使用UDP協議傳送數據時,由于UDP的面向無連接性,不能保證數據的完整性,因此在傳輸重要數據時不建議使用UDP協議。
特點:數據被限制在64kb以內,超出這個范圍就不能發送了。
數據報(Datagram):網絡傳輸的基本單位
2. TCP:傳輸控制協議 (Transmission Control Protocol)。TCP協議是面向連接的通信協議,
即傳輸數據之前,在發送端和接收端建立邏輯連接,然后再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。
在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”。
三次握手:TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠。
第一次握手,客戶端向服務器端發出連接請求,等待服務器確認。
第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求。
第三次握手,客戶端再次向服務器端發送確認信息,確認連接。
完成三次握手,連接建立后,客戶端和服務器就可以開始進行數據傳輸了。由于這種面向連接的特性,TCP協議可以保證傳輸數據的安全,所以應用十分廣泛,例如下載文件、瀏覽網頁等。
3. IP地址:指互聯網協議地址(Internet Protocol Address)
IPv4:是一個32位的二進制數,通常被分為4個字節,表示成`a.b.c.d` 的形式,例如`192.168.65.100` 。其中a、b、c、d都是0~255之間的十進制整數,那么最多可以表示42億個。
IPv6:由于互聯網的蓬勃發展,IP地址的需求量愈來愈大,但是網絡地址資源有限,使得IP的分配越發緊張。
為了擴大地址空間,擬通過IPv6重新定義地址空間,采用128位地址長度,每16個字節一組,分成8組十六進制數,
表示成`ABCD:EF01:2345:6789:ABCD:EF01:2345:6789`,號稱可以為全世界的每一粒沙子編上一個網址,這樣就解決了網絡地址資源數量不夠的問題。
4. 端口號
網絡的通信,本質上是兩個進程(應用程序)的通信。每臺計算機都有很多的進程,那么在網絡通信時,如何區分這些進程呢?
如果說IP地址可以唯一標識網絡中的設備,那么端口號就可以唯一標識設備中的進程(應用程序)了。
端口號:用兩個字節表示的整數,它的取值范圍是0~65535。
其中,0~1023之間的端口號用于一些知名的網絡服務和應用,普通的應用程序需要使用1024以上的端口號。
如果端口號被另外一個服務或應用所占用,會導致當前程序啟動失敗。
利用`協議`+`IP地址`+`端口號` 三元組合,就可以標識網絡中的進程了,那么進程間的通信就可以利用這個標識與其它進程進行交互。
java實現服務端和客戶端
java中提供兩個類
1. 客戶端:`java.net.Socket` 類表示。創建`Socket`對象,向服務端發出連接請求,服務端響應請求,兩者建立連接開始通信。
2. 服務端:`java.net.ServerSocket` 類表示。創建`ServerSocket`對象,相當于開啟一個服務,并等待客戶端的連接。
Socket 類:該類實現客戶端套接字,套接字指的是兩臺設備之間通訊的端點。
構造方法:
public
成員方法:
public
ServerSocket類:這個類實現了服務器套接字,該對象等待通過網絡的請求。
構造方法
public
成員方法
public