網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。
網絡概述html
(1)路由器和交換機組成了核心的計算機網絡,計算機只是這個網絡上的節點以及控制等,經過光纖、網線等鏈接將設備鏈接起來,從而造成了一張巨大的計算機網絡。java
(2)網絡最主要的優點在於共享:共享設備和數據,如今共享設備最多見的是打印機。git
(3)IP地址:爲了可以方便的識別網絡上的每一個設備,網絡中的每一個設備的惟一的數字標識。如今命名IP地址的規定是IPv4協議,該協議規定每一個IP地址由4個0-255之間的數字組成,例如10.0.120.34。IP地址多是固定的,例如網絡上各類各樣的服務器;也能夠是動態的,例如使用ADSL撥號上網的寬帶用戶。程序員
(4)域名(Domain Name):例如sohu.com等。一個IP地址能夠對應多個域名,一個域名只能對應一個IP地址。編程
(5)DNS服務器:在網絡中傳輸的數據,所有是以IP地址做爲地址標識,因此在實際傳輸數據之前須要將域名轉換爲IP地址,實現這種功能的服務器稱之爲DNS服務器,也就是通俗的說法叫作域名解析。數組
(6)端口(port):讓一個計算機能夠同時運行多個網絡程序,在同一個計算機中每一個程序對應惟一的端口。 在硬件上規定,端口的號碼必須位於0-65535之間,每一個端口惟一的對應一個網絡程序,一個網絡程序可使用多個端口。瀏覽器
(1)網絡編程就是兩個或多個程序之間的數據交換。服務器
(2)「請求-響應」模型:通信的一端發送數據,另一端反饋數據,網絡通信都基於該模型。 在網絡通信中,第一次主動發起通信的程序被稱做客戶端(Client)程序,簡稱客戶端,而在第一次通信中等待鏈接的程序被稱做服務器端(Server)程序,簡稱服務器。一旦通信創建,則客戶端和服務器端徹底同樣,沒有本質的區別。網絡
(3)客戶端/服務器結構:也叫作Client/Server結構,簡稱C/S結構。優點:客戶端是專門開發的,根據須要實現各類效果;劣勢:通用性差,幾乎不能通用等,在實際維護時,也須要維護專門的客戶端和服務器端,維護的壓力比較大。socket
(4)覽器/服務器結構:也叫作Browser/Server結構,簡稱爲B/S結構。優點:開發的壓力比較小,不須要維護客戶端;劣勢:瀏覽器的限制比較大,表現力不強,沒法進行系統級操做等。B/S結構其實也就是一種特殊的C/S結構。
(5)P2P程序:是一種特殊的程序,既包含客戶端程序,也包含服務器端程序。使用客戶端程序部分鏈接其它的種子(服務器端),而使用服務器端向其它的BT客戶端傳輸數據。
(6)協議(Protocol):在實際進行數據交換時數據的格式。由於各個網絡程序之間協議格式的不一樣,致使了客戶端程序都是專用的結構。
(1)現有的網絡中,網絡通信的方式主要有兩種:
·TCP(傳輸控制協議)方式 ·UDP(用戶數據報協議)方式
(2)TCP方式:使用該種方式進行網絡通信時,須要創建專門的虛擬鏈接,而後進行可靠的數據傳輸,若是數據發送失敗,則客戶端會自動重發該數據。重要的數據通常使用TCP方式進行數據傳輸。因爲TCP須要創建專用的虛擬鏈接以及確認傳輸是否正確,因此使用TCP方式的速度稍微慢一些,並且傳輸時產生的數據量要比UDP稍微大一些。
(3)UDP方式:使用這種方式進行網絡通信時,不須要創建專門的虛擬鏈接,傳輸也不是很可靠,若是發送失敗則客戶端沒法得到。大量的非核心數據則都經過UDP方式進行傳遞。
網絡編程技術
(1)客戶端網絡編程步驟
一、創建網絡鏈接:客戶端網絡編程的第一步都是創建網絡鏈接。在創建網絡鏈接時須要指定鏈接到的服務器的IP地址和端口號,創建完成之後,會造成一條虛擬的鏈接,後續的操做就能夠經過該鏈接實現數據交換了。
二、交換數據:鏈接創建之後,就能夠經過這個鏈接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到服務器,服務器反饋一個響應數據給客戶端,若是客戶端不發送請求則服務器端就不響應。根據邏輯須要,能夠屢次交換數據,可是仍是必須遵循請求響應模型。
三、關閉網絡鏈接:在數據交換完成之後,關閉網絡鏈接,釋放程序佔用的端口、內存等系統資源,結束網絡編程。
(2)服務器端網絡編程步驟
一、 監聽端口:服務器端屬於被動等待鏈接,因此服務器端啓動之後,不須要發起鏈接,而只須要監聽本地計算機的某個固定端口便可。這個端口就是服務器端開放給客戶端的端口,服務器端程序運行的本地計算機的IP地址就是服務器端程序的IP地址。
二、 得到鏈接:當客戶端鏈接到服務器端時,服務器端就能夠得到一個鏈接,這個鏈接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也經過該鏈接進行數據交換。通常在服務器端編程中,當得到鏈接時,須要開啓專門的線程處理該鏈接,每一個鏈接都由獨立的線程實現。
三、 交換數據:服務器端經過得到的鏈接進行數據交換。服務器端的數據交換步驟是首先接收客戶端發送過來的數據,而後進行邏輯處理,再把處理之後的結果數據發送給客戶端。簡單來講,就是先接收再發送,這個和客戶端的數據交換數序不一樣。其實,服務器端得到的鏈接和客戶端鏈接是同樣的,只是數據交換的步驟不一樣。固然,服務器端的數據交換也是能夠屢次進行的。在數據交換完成之後,關閉和客戶端的鏈接。
四、 關閉鏈接:當服務器程序關閉時,須要關閉服務器端,經過關閉服務器端使得服務器監聽的端口以及佔用的內存能夠釋放出來,實現了鏈接的關閉。
(3)TCP方式是須要創建鏈接的,對於服務器端的壓力比較大,而UDP是不須要創建鏈接的,對於服務器端的壓力比較小。
(1)和網絡編程有關的基本API位於~java.net~包中,該包中包含了基本的網絡編程實現,該包是網絡編程的基礎。該包中既包含基礎的網絡編程類,也包含封裝後的專門處理WEB相關的處理類。
(2)InetAddress類:該類的功能是表明一個IP地址,而且將IP地址和域名相關的操做方法包含在該類的內部。
3.TCP編程
(1)TCP方式的網絡通信是指在通信的過程當中保持鏈接,只須要創建一次網絡鏈接,就能夠屢次傳輸數據。
(2)以~java.net.Socket~類表明客戶端鏈接,以~java.net.ServerSocket~類表明服務器端鏈接。程序員實際編程時,只須要指定IP地址和端口號碼就能夠創建鏈接了。
(3)客戶端網絡編程:首先須要創建鏈接,在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();
(4)簡單的網絡客戶端程序示例:
若是須要在控制檯下面編譯和運行該代碼,須要首先在控制檯下切換到源代碼所在的目錄,而後依次輸入編譯和運行命令:
javac –d . SimpleSocketClient.java java tcp.SimpleSocketClient
(5)服務器端程序編程:因爲服務器端實現的是被動等待鏈接,因此服務器端編程的第一個步驟是監聽端口,也就是監聽是否有客戶端鏈接到達。實現服務器端監聽的代碼爲:
ServerSocket ss = new ServerSocket(10000);
服務器端編程的第二個步驟是得到鏈接。該步驟的做用是當有客戶端鏈接到達時,創建一個和客戶端鏈接對應的Socket連 接對象,從而釋放客戶端鏈接對於服務器端端口的佔用。實現功能就像公司的前臺同樣,當一個客戶到達公司時,會告訴前臺我找某某某,而後前臺就通知某某某, 而後就能夠繼續接待其它客戶了。經過得到鏈接,使得客戶端的鏈接在服務器端得到了保持,另外使得服務器端的端口釋放出來,能夠繼續等待其它的客戶端鏈接。 實現得到鏈接的代碼是:
Socket socket = ss.accept();
最後,在服務器端通訊完成之後,關閉服務器端鏈接。實現的代碼爲:
ss.close();
(6)echo服務器端代碼示例:
在控制檯下面編譯和運行該程序的命令和客戶端部分的相似。
(7)複用Socket鏈接:創建鏈接之後,將數據交換的邏輯寫到一個循環中就能夠了。這樣只要循環不結束則鏈接就不會被關閉。
創建一次鏈接,進行屢次數據交換示例(使用SimpleSocketServer服務器代碼):
出現異常的緣由:服務器端是對話一次數據之後就關閉了鏈接,若是服務器端程序關閉了,客戶端繼續發送數據確定會出現異常。
複用服務器端的鏈接示例:
(8)使服務器端支持多個客戶端同時工做:服務器端接收到一個鏈接時,啓動一個專門的線程處理和該客戶端的通信。改寫的服務端示例程序將由兩個部分組成,MulThreadSocketServer類實現服務器端控制,實現接收客戶端鏈接,而後開啓專門的邏輯線程處理該鏈接,LogicThread類實現對於一個客戶端鏈接的邏輯處理,將處理的邏輯放置在該類的run方法中。
(9)線程池(Thread pool):就是在程序啓動時首先把須要個數的線程對象建立好。能夠提升程序的執行速度,優化程序對於內存的佔用等。
4.UDP方式的編程
(1)DatagramSocket類:實現「網絡鏈接」,包括客戶端網絡鏈接和服務器端網絡鏈接。DatagramSocket實現的就是發送數據時的發射器,以及接收數據時的監聽器的角色。類比於TCP中的網絡鏈接,該類既能夠用於實現客戶端鏈接,也能夠用於實現服務器端鏈接。
(2)DatagramPacket類:實現對於網絡中傳輸的數據封裝,也就是說,該類的對象表明網絡中交換的數據。在UDP方式的網絡編程中,不管是須要發送的數據仍是須要接收的數據,都必須被處理成DatagramPacket類型的對象,該對象中包含發送到的地址、發送到的端口號以及發送的內容等。和TCP方式的網絡傳輸相比,IO編程在UDP方式的網絡編程中變得不是必須的內容,結構也要比TCP方式的網絡編程簡單一些。
(3)UDP客戶端編程涉及的步驟也是4個部分:創建鏈接、發送數據、接收數據和關閉鏈接。
首先介紹UDP方式的網絡編程中創建鏈接的實現。其中UDP方式的創建鏈接和TCP方式不一樣,只須要創建一個鏈接對象便可,不須要指定服務器的IP和端口號碼。實現的代碼爲:
DatagramSocket ds = new DatagramSocket();
固然,能夠經過制定鏈接使用的端口號來建立客戶端鏈接。
DatagramSocket ds = new DatagramSocket(5000);
接着,介紹一下UDP客戶端編程中發送數據的實現。在UDP方式的網絡編程中,IO技術不是必須的,在發送數據時,須要將須要發送的數據內容首先轉換爲byte數組,而後將數據內容、服務器IP和服務器端口號一塊兒構形成一個DatagramPacket類型的對象,這樣數據的準備就完成了,發送時調用網絡鏈接對象中的send方法發送該對象便可。例如將字符串「Hello」發送到IP是127.0.0.1,端口號是10001的服務器,則實現發送數據的代碼以下:
String s = 「Hello」; String host = 「127.0.0.1」; int port = 10001; //將發送的內容轉換爲byte數組 byte[] b = s.getBytes(); //將服務器IP轉換爲InetAddress對象 InetAddress server = InetAddress.getByName(host); //構造發送的數據包對象 DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port); //發送數據 ds.send(sendDp);
下面介紹一下UDP客戶端編程中接收數據的實現。當數據發送出去之後,就能夠接收服務器端的反饋信息了。接收數據在Java語言中的實現是這樣的:首先構造一個數據緩衝數組,該數組用於存儲接收的服務器端反饋數據,該數組的長度必須大於或等於服務器端反饋的實際有效數據的長度。而後以該緩衝數組爲基礎構造一個DatagramPacket數據包對象,最後調用鏈接對象的receive方法接收數據便可。接收到的服務器端反饋數據存儲在DatagramPacket類型的對象內部。實現接收數據以及顯示服務器端反饋內容的示例代碼以下:
//構造緩衝數組 byte[] data = new byte[1024]; //構造數據包對象 DatagramPacket received = new DatagramPacket(data,data.length); //接收數據 ds.receive(receiveDp); //輸出數據內容 byte[] b = receiveDp.getData(); //得到緩衝數組 int len = receiveDp.getLength(); //得到有效數據長度 String s = new String(b,0,len); System.out.println(s);
UDP方式客戶端網絡編程的最後一個步驟就是關閉鏈接。雖然UDP方式不創建專用的虛擬鏈接,可是鏈接對象仍是須要佔用系統資源,因此在使用完成之後必須關閉鏈接。關閉鏈接使用鏈接對象中的close方法便可,實現的代碼以下:
ds.close();
(4)UDP方式網絡編程的服務器端實現和TCP方式的服務器端實現相似。
首先UDP方式服務器端網絡編程須要創建一個鏈接,該鏈接監聽某個端口,實現的代碼爲:
DatagramSocket ds = new DatagramSocket(10010);
接收到客戶端發送過來的數據之後,服務器端對該數據進行邏輯處理,而後將處理之後的結果再發送給客戶端,在這裏發送時就比客戶端要麻煩一些,由於服務器端須要得到客戶端的IP和客戶端使用的端口號,這個均可以從接收到的數據包中得到。示例代碼以下:
//得到客戶端的IP InetAddress clientIP = receiveDp.getAddress(); //得到客戶端的端口號 Int clientPort = receiveDp.getPort();
最後,當服務器端實現完成之後,關閉服務器端鏈接,實現的方式爲調用鏈接對象的close方法,示例代碼以下:
ds.close();
(5)UDP網絡編程的基本使用。
1.網絡協議是指對於網絡中傳輸的數據格式的規定。網絡協議的實質也是客戶端程序和服務器端程序對於數據的一種約定,使用數字來表明內容,進行設計時通常遵循「簡單、通用、容易解析」的原則進行。
2.在網絡編程中,對於同一個網絡程序來講,通常都會涉及到兩個網絡協議格式:客戶端發送數據格式和服務器端反饋數據格式,在實際設計時,須要一一對應。
3.客戶端程序和服務器端程序須要進行協議處理的代碼分別以下。
客戶端程序須要完成的處理爲:
一、 客戶端發送協議格式的生成 二、 服務器端反饋數據格式的解析
服務器端程序須要完成的處理爲:
一、 服務器端反饋協議格式的生成 二、 客戶端發送協議格式的解析
4.對於一種網絡程序來講,網絡協議格式是該程序最核心的技術祕密。
1.質數判別示例
(1)程序功能
客戶端程序功能:
a) 接收用戶控制檯輸入 b) 判斷輸入內容是否合法 c) 按照協議格式生成發送數據 d) 發送數據 e) 接收服務器端反饋 f) 解析服務器端反饋信息,並輸出
服務器端程序功能:
a) 接收客戶端發送數據 b) 按照協議格式解析數據 c) 判斷數字是不是質數 d) 根據判斷結果,生成協議數據 e) 將數據反饋給客戶端
(2)協議格式
客戶端發送協議格式:
將用戶輸入的數字轉換爲字符串,再將字符串轉換爲byte數組便可。
客戶端發送「quit」字符串表明結束鏈接。
服務器端發送協議格式:
反饋數據長度爲1個字節。數字0表明是質數,1表明不是質數,2表明協議格式錯誤。
(3)以TCP方式實現程序。
2.猜數字小遊戲
(1)程序功能
客戶端程序功能列表:
一、 接收用戶控制檯輸入 二、 判斷輸入內容是否合法 三、 按照協議格式發送數據 四、 根據服務器端的反饋給出相應提示
服務器端程序功能列表:
一、 接收客戶端發送數據 二、 按照協議格式解析數據 三、 判斷髮送過來的數字和隨機數字的關係 四、 根據判斷結果生產協議數據 五、 將生產的數據反饋給客戶端
(2)協議格式
客戶端程序協議格式以下:
一、 將用戶輸入的數字轉換爲字符串,而後轉換爲byte數組 二、 發送「quit」字符串表明退出
教材學習有問題先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,若是別人沒有提出相同問題,能夠編輯文檔添加,而後把本身提出的問題複製到下面:
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx
上週博客互評狀況(只要連接,具體點評放相應博客下)
學期過半應該繼續努力
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 10/10 | 1/1 | 10/10 | |
第二週 | 110/200 | 1/2 | 10/20 | |
第三週 | 150/350 | 1/3 | 10/30 | |
第四周 | 400/750 | 1/4 | 15/45 | |
第五週 | 430/1200 | 1/5 | 20/65 | |
第六週 | 700/2000 | 1/6 | 20/85 | |
第七週 | 700/2700 | 3/9 | 30/115 | |
第八週 | 300/3000 | 1/10 | 40/135 | |
第九周 | 500/3500 | 2/12 | 65/200 | |
第十週 | 500/4000 | 1/13 | 30/230 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:XX小時
實際學習時間:XX小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)