20155207 2016-2017-2 《Java程序設計》第十週學習總結
教材學習內容總結
網絡編程
- 網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。
狹義的網絡編程範疇:程序員所做的事情,就是把數據發送到指定的位置,或者接收到指定的數據。html
1 網絡概述
1.1 計算機網絡概述
- 計算機網絡:經過必定的物理設備將處於不一樣位置的計算機鏈接起來組成的網絡,這個網絡中包含的設備有:計算機、路由器、交換機等等。
- IP地址:網絡中的每一個設備都會有一個惟一的數字標識,命名IP地址的規定是IPv4協議,該協議規定每一個IP地址由4個0-255之間的數字組成
- 域名:一個IP地址能夠對應多個域名,一個域名只能對應一個IP地址。
- 域名解析:經過DNS服務器將域名轉換爲IP地址。
- 端口(port):在同一個計算機中每一個程序對應惟一的端口,這樣一個計算機上就能夠經過端口區分發送給每一個端口的數據了,也就是一個計算機上能夠併發運行多個網絡程序,而不會在互相之間產生干擾。
進行網絡通信交換時,就能夠經過IP地址查找到該臺計算機,而後經過端口標識這臺計算機上的一個惟一的程序。java
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):規定該數據的格式,這個數據的格式就是協議
協議的設計以及協議的生產和解析纔是網絡編程中最核心的內容git
1.3 網絡通信方式
- 現有的網絡中,網絡通信的方式主要有兩種:一、 TCP(傳輸控制協議)方式
二、 UDP(用戶數據報協議)方式
- TCP方式須要創建專門的虛擬鏈接,而後進行可靠的數據傳輸,若是數據發送失敗,則客戶端會自動重發該數據
UDP方式不須要創建專門的虛擬鏈接,傳輸也不是很可靠,若是發送失敗則客戶端沒法得到程序員
2 網絡編程技術
2.1 網絡編程步驟
2.1.1 客戶端網絡編程步驟
客戶端的編程主要由三個步驟實現:一、 創建網絡鏈接:創建網絡鏈接時須要指定鏈接到的服務器的IP地址和端口號 二、 交換數據 三、 關閉網絡鏈接編程
2.1.2 服務器端網絡編程步驟
服務器端通常實現程序的核心邏輯以及數據存儲等核心功能四個步驟:一、 監聽端口 二、 得到鏈接 三、 交換數據 四、 關閉鏈接數組
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();
併發
教材學習中的問題和解決過程
代碼調試中的問題和解決過程
本週沒有問題
find src -name "*.java" | xargs cat | grep -v ^$ | wc -l
![](http://static.javashuo.com/static/loading.gif)
上週考試錯題總結
- 錯題1及緣由,理解狀況
- 錯題2及緣由,理解狀況
- ...
結對及互評
評分標準
- 正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
- 模板中的要素齊全(加1分)
- 缺乏「教材學習中的問題和解決過程」的不加分
- 缺乏「代碼調試中的問題和解決過程」的不加分
- 代碼託管不能打開的不加分
- 缺乏「結對及互評」的不能打開的不加分
- 缺乏「上週考試錯題總結」的不能加分
- 缺乏「進度條」的不能加分
- 缺乏「參考資料」的不能加分
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
- 本週有效代碼超過300分行的(加2分)
- 其餘加分:
- 週五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進狀況的加1分
- 有動手寫新代碼的加1分
- 課後選擇題有驗證的加1分
- 代碼Commit Message規範的加1分
- 錯題學習深刻的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
- 結對學習狀況真實可信的加1分
- 扣分:
- 有抄襲的扣至0分
- 代碼做弊的扣至0分
- 遲交做業的扣至0分
點評模板:
點評過的同窗博客和代碼
其餘(感悟、思考等,可選)
本週學習了網絡編程,感受仍是挺難的,畢竟以前歷來沒有接觸過與網絡進行聯通的編程內容,可是也頗有趣,感受頗有實際用處
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
|
第一週 |
0/0 |
2/2 |
20/20 |
|
第二週 |
186/186 |
2/4 |
18/38 |
|
第三週 |
689/875 |
3/7 |
22/60 |
|
第四周 |
242/1117 |
2/9 |
30/90 |
|
第五週 |
698/1815 |
2/9 |
30/120 |
|
第六週 |
1269/3084 |
2/9 |
30/120 |
|
第七週 |
342/3426 |
2/9 |
30/120 |
|
第八週 |
398/3824 |
2/9 |
30/120 |
|
第九周 |
1198/5012 |
2/9 |
30/120 |
|
第十週 |
202/5214 |
2/9 |
30/120 |
|
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
參考:軟件工程軟件的估計爲何這麼難,軟件工程 估計方法
計劃學習時間:18小時
實際學習時間:16小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)
參考資料