![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yYiFDMzQjN3AjMlJDZygTO4QWMyIGZzUTN5IzMhhzMw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
學習Java的第022天——寫在端午節之後
了解學習了網絡程式設計的基本概念,IP和端口、socket含義,TCP協定和UDP協定 、InetAddress/InetSocketAddress/URL、基于TCP的Socket程式設計 、基于TCP的Socket程式設計實作聊天室等内容等。
首先:計算機網絡的作用是資源共享和資訊傳遞。
2. 計算機網絡的組成:
a) 計算機硬體:計算機(大中小型伺服器,桌上型電腦、筆記本等)、外部裝置(路由器、交換機等)、通信線路(雙絞線、光纖等)。
b) 計算機軟體:網絡作業系統(Windows 2000 Server/Advance Server、Unix、Linux等)、網絡管理軟體(WorkWin、SugarNMS等)、網絡通信協定(如TCP/IP協定棧等)。
3. 計算機網絡的多台計算機是具有獨立功能的,而不是脫離網絡就無法存在的。
(1) 網絡程式設計的三要素是什麼?
①IP 位址:唯一辨別網絡上的每一台計算機,兩台計算機之 間通信的必備有素 ;
②端口号:計算機中應用的标号(代表一個應用程式), 0-1024 系統使用或保留端口 ,端号口占 2 個位元組,是以 有效端口 0-65535 ;
③通信協定:通信的規則 TCP,UDP 。
解釋一下通信協定就是:
通過計算機網絡可以實作不同計算機之間的連接配接與通信,但是計算機網絡中實作通信必須有一些約定即通信協定,對速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等制定标準。
國際标準化組織(ISO,即International Organization for Standardization)定義了網絡通信協定的基本架構,被稱為OSI(Open System Interconnect,即開放系統互聯)模型。OSI模型制定的七層标準模型,分别是:應用層,表示層,會話層,傳輸層,網絡層,資料鍊路層,實體層。
雖然國際标準化組織制定了這樣一個網絡通信協定的模型,但是實際上網際網路通訊使用最多的網絡通信協定是TCP/IP網絡通信協定。
TCP/IP 是一個協定族,也是按照層次劃分,共四層:應用層,傳輸層,互連網絡層,網絡接口層(實體+資料鍊路層)。
開放系統互連參考模型與TCP/IP參考模型對比
用來辨別網絡中的一個通信實體的位址。通信實體可以是計算機、路由器等。 比如網際網路的每個伺服器都要有自己的IP位址,而每個區域網路的計算機要通信也要配置IP位址。路由器是連接配接兩個或多個網絡的網絡裝置。
目前主流使用的IP位址是IPV4,但是随着網絡規模的不斷擴大,IPV4面臨着枯竭的危險,是以推出了IPV6。
IPV4:32位位址,并以8位為一個機關,分成四部分,以點分十進制表示,如192.168.0.1。因為8位二進制的計數範圍是00000000---11111111,對應十進制的0-255,是以-4.278.4.1是錯誤的IPV4位址。
IPV6:128位(16個位元組)寫成8個16位的無符号整數,每個整數用四個十六進制位表示,每個數之間用冒号(:)分開,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
需要知道的是:
1. 127.0.0.1 本機位址
2. 192.168.0.0--192.168.255.255為私有位址,屬于非注冊位址,專門為組織機構内部使用。
IP位址用來辨別一台計算機,但是一台計算機上可能提供多種網絡應用程式,如何來區分這些不同的程式呢?這就要用到端口。
端口是虛拟的概念,并不是說在主機上真的有若幹個端口。通過端口,可以在一個主機上運作多個網絡應用程式。 端口的表示是一個16位的二進制整數,對應十進制的0-65535。
.IP位址好比每個人的位址(門牌号),端口好比是房間号。必須同時指定IP位址和端口号才能夠正确的發送資料。
我們開發的網絡應用程式位于應用層,TCP和UDP屬于傳輸層協定,在應用層如何使用傳輸層的服務呢?在應用層和傳輸層之間,則是使用套接Socket來進行分離。
套接字就像是傳輸層為應用層開的一個小口,應用程式通過這個小口向遠端發送資料,或者接收遠端發來的資料;而這個小口以内,也就是資料進入這個口之後,或者資料從這個口出來之前,是不知道也不需要知道的,也不會關心它如何傳輸,這屬于網絡其它層次工作。
Socket實際是傳輸層供給應用層的程式設計接口。Socket就是應用層與傳輸層之間的橋梁。使用Socket程式設計可以開發客戶機和伺服器應用程式,可以在本地網絡上進行通信,也可通過Internet在全球範圍内通信。
Socket的作用
TCP協定和UDP協定是傳輸層的兩種協定。Socket是傳輸層供給應用層的程式設計接口,是以Socket程式設計就分為TCP程式設計和UDP程式設計兩類。
在網絡通訊中,TCP方式就類似于撥打電話,使用該種方式進行網絡通訊時,需要建立專門的虛拟連接配接,然後進行可靠的資料傳輸,如果資料發送失敗,則用戶端會自動重發該資料。而UDP方式就類似于發送短信,使用這種方式進行網絡通訊時,不需要建立專門的虛拟連接配接,傳輸也不是很可靠,如果發送失敗則用戶端無法獲得。
總的來講就是:
TCP是面向連接配接的,傳輸資料安全,穩定,效率相對較低。
UDP是面向無連接配接的,傳輸資料不安全,效率較高。
TCP通信原理是:
伺服器建立 ServerSocket,在指定端口監聽并處理請求;
用戶端建立 Socket,向伺服器發送請求 ;
TCP在建立連接配接時又分三步走:
第一步,是請求端(用戶端)發送一個包含SYN即同步(Synchronize)标志的TCP封包,SYN同步封包會指明用戶端使用的端口以及TCP連接配接的初始序号。
第二步,伺服器在收到用戶端的SYN封包後,将傳回一個SYN+ACK的封包,表示用戶端的請求被接受,同時TCP序号被加一,ACK即确認(Acknowledgement)。
第三步,用戶端也傳回一個确認封包ACK給伺服器端,同樣TCP序列号被加一,到此一個TCP連接配接完成。然後才開始通信的第二步:資料處理。
這就是所說的TCP的三次握手(Three-way Handshake)。
基于UDP協定的通信方式,稱為資料報通信方式。在這種方式中,每個資料發送單元被統一封裝成資料報包的方式,發送方将資料報包發送到網絡中,資料報包在網絡中去尋找它的目的地。
UDP協定的特點是:
Ø 不需要利用 IO 流實作資料的傳輸
Ø 每個資料發送單元被統一封裝成資料包的方式,發送方将資料包發送到網絡中,資料包在網絡中去尋找他的目的地。
Ø DatagramSocket:用于發送或接收資料包
Ø DatagramPacket:資料包
Java為了可移植性,不允許直接調用作業系統,而是由http://java.net包來提供網絡功能。Java虛拟機負責提供與作業系統的實際連接配接。
InetAddress類的作用及常用方法;
作用:封裝計算機的IP 位址,不包含端口号
方法:String getHostAddress()-----獲得IP 位址
String getHostName()-----獲得主機名
static InetAddress getByName(String host)-----根據主機名獲得IP 位址
InetSocketAddress類的作用及常用方法;
作用:此類用于實作 IP套接字位址 (IP 位址+端口号),用于socket 通信
方法:InetAddress getAddress()-----擷取InetAddress對象
int getPort()-----擷取端口号
String getHostName()-----擷取主機名
IP位址唯一辨別了Internet上的計算機,而URL則辨別了這些計算機上的資源。類 URL 代表一個統一資源定位符,它是指向網際網路“資源”的指針。資源可以是簡單的檔案或目錄,也可以是對更為複雜的對象的引用,例如對資料庫或搜尋引擎的查詢。
URL的常用方法有:
String getProtocal()-----擷取此 URL 的協定名稱
String getHost()-----擷取此 URL 的主機名(如果适用)
int getPort()-----擷取 URL 的端口号
String getFile()-----擷取此 URL 的檔案名
getDefaultPort()-----擷取與此 URL 關聯協定的預設端口号
getPath()-----擷取此 URL 的路徑部分
openStream()方法-----打開到此 URL 的連接配接并傳回一個用于從該連接配接讀入的 InputStream 。
基于TCP協定的Socket程式設計_雙向通信_實作單次請求與響應
Soket程式設計實作一次雙向通信的傳輸示意圖
(1) 實作一次單次請求與響應,用戶端與伺服器的操作步驟是什麼?
用戶端:
1. 建立Socket對象
2. 擷取輸出流
3. 擷取輸入流
4. 關閉流,關閉Socket。
伺服器端:
1.建立ServerSocket對象
2. 監聽是否有用戶端請求連接配接
3. 擷取輸入流
4. 擷取輸出流
5. 關閉流,關閉Socket
也可以說:
Ø 1. 建立伺服器ServerSocket,在建立時,定義ServerSocket的監聽端口(在這個端口接收用戶端發來的消息)。
Ø 2. ServerSocket調用accept()方法,使之處于阻塞狀态。
Ø 3. 建立用戶端Socket,并設定伺服器的IP及端口。
Ø 4. 用戶端發出連接配接請求,建立連接配接。
Ø 5. 分别取得伺服器和用戶端Socket的InputStream和OutputStream。
Ø 6. 利用Socket和ServerSocket進行資料傳輸。
Ø 7. 關閉流及Socket
雙向通信_實作單次請求與響應---用戶端
雙向通信_實作單次請求與響應---伺服器端
兩台電腦可以進行簡單的單次雙向通信
TCP協定的Socket程式設計_雙向通信_實作模拟使用者登入
雙向通信使用者登入的示意圖:
使用者登入的過程用戶端與伺服器的功能如下
用戶端:1.建立Socket對象
2. 擷取輸出流(對象流)
3. 建立User對象,将封裝後的對象發送伺服器 4. 擷取輸入流(資料流)
5. 關閉流,關閉Socket
功能:發送使用者的資訊接收伺服器的響應
伺服器端:1. 建立ServerSocket對象
2. 擷取輸入流
3. 對使用者名和密碼進行驗證
4. 擷取輸出流
5. 關閉流
功能:接收用戶端的請求和響應用戶端
用戶端與伺服器端單次聊天的缺點是:
隻能用戶端先發送資料,然後才能接收資料,如果不發就 收不到,(接收和發送是在一個線程中實作的)不符合實際情況
單次聊天的缺點的解決方案是
① 多次聊天可以使用循環來解決
② 先發後收的問題可以使用線程來解決,一個接收資料的線 程,一個發送資料的線程
實作群聊的原理是:
用戶端建立接收和發送的線程。
伺服器端建立多個用戶端路徑的線程
使用集合實作轉發效果。
群聊實作的步驟為:
用戶端:1.建立Socket對象
2. 建立發送的線程類對象
3. 建立接收的線程類對象
4. 建立Thread類對象并啟動線程
5. 關閉流
伺服器端:1. 建立集合對象,存儲每一個連接配接進來的用戶端
2. 建立ServerSocket對象
3. 監聽用戶端是否有用戶端連接配接
4. 建立線程類的對象
5. 添加到集合中
6. 啟動線程
7. 關閉流
(缺少的示例程式後續會練習并補充)