21045308劉昊陽 《Java程式設計》第十周學習總結
教材學習内容總結
網絡程式設計
- 網絡程式設計就是在兩個或兩個以上的裝置(例如計算機)之間傳輸資料。
- 狹義的網絡程式設計範疇:程式員所作的事情,就是把資料發送到指定的位置,或者接收到指定的資料。
1 網絡概述
1.1 計算機網絡概述
- 計算機網絡:通過一定的實體裝置将處于不同位置的計算機連接配接起來組成的網絡,這個網絡中包含的裝置有:計算機、路由器、交換機等等。
- IP位址:網絡中的每個裝置都會有一個唯一的數字辨別,命名IP位址的規定是IPv4協定,該協定規定每個IP位址由4個0-255之間的數字組成
- 域名:一個IP位址可以對應多個域名,一個域名隻能對應一個IP位址。
- 域名解析:通過DNS伺服器将域名轉換為IP位址。
- 端口(port):在同一個計算機中每個程式對應唯一的端口,這樣一個計算機上就可以通過端口區分發送給每個端口的資料了,也就是一個計算機上可以并發運作多個網絡程式,而不會在互相之間産生幹擾。
- 進行網絡通訊交換時,就可以通過IP位址查找到該台計算機,然後通過端口辨別這台計算機上的一個唯一的程式。
1.2 網絡程式設計概述
- 網絡通訊基于“請求-響應”模型,通訊的一端發送資料,另外一端回報資料。
- C/S結構:用戶端與伺服器端:網絡程式設計中的兩種程式就分别是用戶端和伺服器端,第一次主動發起通訊的程式被稱作用戶端(Client)程式,簡稱用戶端,而在第一次通訊中等待連接配接的程式被稱作伺服器端(Server)程式,簡稱伺服器。一旦通訊建立,則用戶端和伺服器端完全一樣,沒有本質的差別,這種網絡程式設計的結構被稱作用戶端/伺服器結構,也叫做Client/Server結構,簡稱C/S結構。
- B/S結構:沒有必要使用專用的用戶端,而需要使用通用的用戶端,例如浏覽器,使用浏覽器作為用戶端的結構被稱作浏覽器/伺服器結構,也叫做Browser/Server結構,簡稱為B/S結構。在開發時隻需要開發伺服器端即可,這種結構的優勢在于開發的壓力比較小,不需要維護用戶端。這種結構也存在着很多不足,例如浏覽器的限制比較大,表現力不強,無法進行系統級操作等。
- B/S結構其實也就是一種特殊的C/S結構。
- P2P(Point to Point)程式:一個P2P程式中既包含用戶端程式,也包含伺服器端程式
- 協定(Protocol):規定該資料的格式,這個資料的格式就是協定
- 協定的設計以及協定的生産和解析才是網絡程式設計中最核心的内容
1.3 網絡通訊方式
-
現有的網絡中,網絡通訊的方式主要有兩種:1、 TCP(傳輸控制協定)方式
2、 UDP(使用者資料報協定)方式
- TCP方式需要建立專門的虛拟連接配接,然後進行可靠的資料傳輸,如果資料發送失敗,則用戶端會自動重發該資料
- UDP方式不需要建立專門的虛拟連接配接,傳輸也不是很可靠,如果發送失敗則用戶端無法獲得
2 網絡程式設計技術
2.1 網絡程式設計步驟
2.1.1 用戶端網絡程式設計步驟
- 用戶端的程式設計主要由三個步驟實作:1、 建立網絡連接配接:建立網絡連接配接時需要指定連接配接到的伺服器的IP位址和端口号 2、 交換資料 3、 關閉網絡連接配接
2.1.2 伺服器端網絡程式設計步驟
- 伺服器端一般實作程式的核心邏輯以及資料存儲等核心功能四個步驟:1、 監聽端口 2、 獲得連接配接 3、 交換資料 4、 關閉連接配接
2.1.3 小結
2.2 Java網絡程式設計技術
- 和網絡程式設計有關的基本API位于java.net包中
- InetAddress類:該類的功能是代表一個IP位址,并且将IP位址和域名相關的操作方法包含在該類的内部
2.3 TCP程式設計
- TCP方式的網絡程式設計,以java.net.Socket類代表用戶端連接配接,以java.net.ServerSocket類代表伺服器端連接配接,程式員實際程式設計時,隻需要指定IP位址和端口号碼就可以建立連接配接了
-
建立連接配接,在Java API中以java.net.Socket類的對象代表網絡連接配接,是以建立用戶端網絡連接配接,也就是建立Socket類型的對象,該對象代表網絡連接配接,示例如下:
Socket socket1 = new Socket(“192.168.1.103”,10000);
Socket socket2 = new Socket(“www.sohu.com”,80);
-
連接配接一旦建立,緊接着的步驟就是按照“請求-響應”模型進行網絡資料交換,在Java語言中,資料傳輸功能由Java IO實作,也就是說隻需要從連接配接中獲得輸入流和輸出流即可,然後将需要發送的資料寫入連接配接對象的輸出流中,在發送完成以後從輸入流中讀取資料即可。示例代碼如下:
OutputStream os = socket1.getOutputStream(); //獲得輸出流
InputStream is = socket1.getInputStream(); //獲得輸入流
-
資料交換完成以後,關閉網絡連接配接,釋放網絡連接配接占用的系統端口和記憶體等資源,完成網絡操作,示例代碼如下:
socket1.close();
- TCP類型的伺服器端的編寫:1.伺服器端程式設計的第一個步驟是監聽端口,例
ServerSocket ss = new ServerSocket(10000);
2.伺服器端程式設計的第二個步驟是獲得連接配接。該步驟的作用是當有用戶端連接配接到達時,建立一個和用戶端連接配接對應的Socket連 接對象,進而釋放用戶端連接配接對于伺服器端端口的占用,實作獲得連接配接的代碼是:
Socket socket = ss.accept();
3.連接配接獲得以後,後續的程式設計就和用戶端的網絡程式設計類似了,這裡獲得的Socket類型的連接配接就和用戶端的網絡連接配接一樣了,隻是伺服器端需要首先讀取發送過來的資料,然後進行邏輯處理以後再發送給用戶端,也就是交換資料的順序和用戶端交換資料的步驟剛好相反4.在伺服器端通信完成以後,關閉伺服器端連接配接。實作的代碼為:
ss.close();
- 線程池:是池技術的一種,就是在程式啟動時首先把需要個數的線程對象建立好,然後當用戶端連接配接到達時從池中取出一個已經建立完成的線程對象使用即可。當用戶端連接配接關閉以後,将該線程對象重新放入到線程池中供其它的用戶端重複使用,這樣可以提高程式的執行速度,優化程式對于記憶體的占用等。
- UDP方式的網絡程式設計在Java語言中的實作:需要使用的類還是包含在java.net包中,在Java API中,實作UDP方式的程式設計,包含用戶端網絡程式設計和伺服器端網絡程式設計,主要由兩個類實作,分别是:DatagramSocket、DatagramPacket
- DatagramSocket類實作“網絡連接配接”,包括用戶端網絡連接配接和伺服器端網絡連接配接,DatagramSocket實作的就是發送資料時的發射器,以及接收資料時的監聽器的角色。類比于TCP中的網絡連接配接,該類既可以用于實作用戶端連接配接,也可以用于實作伺服器端連接配接
- DatagramPacket類實作對于網絡中傳輸的資料封裝,該類的對象代表網絡中交換的資料,在UDP方式的網絡程式設計中,無論是需要發送的資料還是需要接收的資料,都必須被處理成DatagramPacket類型的對象,該對象中包含發送到的位址、發送到的端口号以及發送的内容等,IO程式設計在UDP方式的網絡程式設計中變得不是必須的内容,結構也要比TCP方式的網絡程式設計簡單一些
-
1.建立連接配接:隻需要建立一個連接配接對象即可,不需要指定伺服器的IP和端口号碼。實作的代碼為:
DatagramSocket ds = new DatagramSocket();
可以通過制定連接配接使用的端口号來建立用戶端連接配接(使用本地計算機的5000号端口)
DatagramSocket ds = new DatagramSocket(5000);
2.發送資料:需要将需要發送的資料内容首先轉換為byte數組,然後将資料内容、伺服器IP和伺服器端口号一起構造成一個DatagramPacket類型的對象,發送時調用網絡連接配接對象中的send方法發送該對象即可
3.關閉連接配接:使用連接配接對象中的close方法即可
- 不管發送的資料内容是什麼,都需要轉換為byte數組,将伺服器端的IP位址構造成InetAddress類型的對象,将這些資訊構造成一個DatagramPacket類型的對象,調用連接配接對象ds的send方法把DatagramPacket對象發送出去即可
- UDP方式的同一個網絡連接配接對象,可以發送到達不同伺服器端IP或端口的資料包,這點是TCP方式無法做到的
-
伺服器端:1.建立連接配接:該連接配接監聽某個端口,實作的代碼為:
DatagramSocket ds = new DatagramSocket(10010);
2.接收用戶端發送過來的資料:receive方法,阻塞方法
3.伺服器端需要獲得用戶端的IP和用戶端使用的端口号,示例代碼如下:
//獲得用戶端的IP
InetAddress clientIP = receiveDp.getAddress();
//獲得用戶端的端口号
Int clientPort = receiveDp.getPort();
4.關閉伺服器端連接配接
ds.close();
網絡協定
網絡程式設計示例
3.1質數判别示例
其他(感悟、思考等,可選)
本周學習了網絡程式設計,感覺還是挺難的,畢竟之前從來沒有接觸過與網絡進行聯通的程式設計内容,但是也很有趣,感覺很有實際用處
學習進度條
代碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小時 | |
第一周 | 30/30 | 1/2 | 16/16 | 基本概念 |
第二周 | 100/130 | 1/3 | 18/34 | 基礎文法 |
第三周 | 100/230 | 1/4 | 26/60 | 對象封裝 |
第四周 | 300/530 | 1/5 | 30/90 | 繼承接口 |
第五周 | 300/830 | 1/6 | 30/120 | 異常 、 |
第六周 | 300/1230 | 2/8 | 30/150 | 輸入輸出、并行 |
第七周 | 100/1330 | 2/10 | 10/160 | 時間日期 |
第八周 | 100/1430 | 2/12 | 15/175 | 通用API |
第九周 | 100/1530 | 2/14 | 15/190 | 資料庫 |
第十周 | 100/1630 | 2/15 | 10/200 |