•網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。程序員所做的事情就是把數據發送到指定的位置,或者接收到指定的數據,這個就是狹義的網絡編程範疇。在發送和接收數據時,大部分的程序設計語言都設計了專門的API實現這些功能,程序員只須要調用便可。因此,基礎的網絡編程能夠和打電話同樣簡單。html
•網絡編程的實質就是兩個(或多個)設備(例如計算機)之間的數據傳輸。java
•路由器和交換機組成了核心的計算機網絡,計算機只是這個網絡上的節點以及控制等,經過光纖、網線等鏈接將設備鏈接起來,從而造成了一張巨大的計算機網絡。程序員
•網絡最主要的優點在於共享:共享設備和數據,如今共享設備最多見的是打印機,一個公司通常一個打印機便可,共享數據就是將大量的數據存儲在一組機器中,其它的計算機經過網絡訪問這些數據,例如網站、銀行服務器等等。編程
•若是須要了解更多的網絡硬件基礎知識,能夠閱讀《計算機網絡》教材,對於基礎進行強化,這個在基礎學習階段不是必須的,可是若是想在網絡編程領域有所造詣,則是一個必須的基本功。瀏覽器
•對於網絡編程來講,最主要的是計算機和計算機之間的通訊,這樣首要的問題就是如何找到網絡上的計算機呢?這就須要瞭解IP地址的概念。服務器
•爲了可以方便的識別網絡上的每一個設備,網絡中的每一個設備都會有一個惟一的數字標識,這個就是IP地址。在計算機網絡中,如今命名IP地址的規定是IPv4協議,該協議規定每一個IP地址由4個0-255之間的數字組成,例如10.0.120.34。每一個接入網絡的計算機都擁有惟一的IP地址,這個IP地址多是固定的,例如網絡上各類各樣的服務器,也能夠是動態的,例如使用ADSL撥號上網的寬帶用戶,不管以何種方式得到或是不是固定的,每一個計算機在聯網之後都擁有一個惟一的合法IP地址,就像每一個手機號碼同樣。網絡
•可是因爲IP地址不容易記憶,因此爲了方便記憶,有創造了另一個概念——域名(Domain Name),例如sohu.com等。一個IP地址能夠對應多個域名,一個域名只能對應一個IP地址。域名的概念能夠類比手機中的通信簿,因爲手機號碼不方便記憶,因此添加一個姓名標識號碼,在實際撥打電話時能夠選擇該姓名,而後撥打便可。併發
•在網絡中傳輸的數據,所有是以IP地址做爲地址標識,因此在實際傳輸數據之前須要將域名轉換爲IP地址,實現這種功能的服務器稱之爲DNS服務器,也就是通俗的說法叫作域名解析。例如當用戶在瀏覽器輸入域名時,瀏覽器首先請求DNS服務器,將域名轉換爲IP地址,而後將轉換後的IP地址反饋給瀏覽器,而後再進行實際的數據傳輸。socket
•當DNS服務器正常工做時,使用IP地址或域名均可以很方便的找到計算機網絡中的某個設備,例如服務器計算機。當DNS不正常工做時,只能經過IP地址訪問該設備。因此IP地址的使用要比域名通用一些。tcp
•IP地址和域名很好的解決了在網絡中找到一個計算機的問題,可是爲了讓一個計算機能夠同時運行多個網絡程序,就引入了另一個概念——端口(port)。
•有了端口的概念之後,在同一個計算機中每一個程序對應惟一的端口,這樣一個計算機上就能夠經過端口區分發送給每一個端口的數據了,換句話說,也就是一個計算機上能夠併發運行多個網絡程序,而不會在互相之間產生干擾。
•在硬件上規定,端口的號碼必須位於0-65535之間,每一個端口惟一的對應一個網絡程序,一個網絡程序可使用多個端口。這樣一個網絡程序運行在一臺計算上時,不論是客戶端仍是服務器,都是至少佔用一個端口進行網絡通信。在接收數據時,首先發送給對應的計算機,而後計算機根據端口把數據轉發給對應的程序。
•有了IP地址和端口的概念之後,在進行網絡通信交換時,就能夠經過IP地址查找到該臺計算機,而後經過端口標識這臺計算機上的一個惟一的程序。這樣就能夠進行網絡數據的交換了。
•網絡編程就是兩個或多個程序之間的數據交換,和普通的單機程序相比,網絡程序最大的不一樣就是須要交換數據的程序運行在不一樣的計算機上,這樣就形成了數據交換的複雜。
•在網絡通信中,第一次主動發起通信的程序被稱做客戶端(Client)程序,簡稱客戶端,而在第一次通信中等待鏈接的程序被稱做服務器端(Server)程序,簡稱服務器。一旦通信創建,則客戶端和服務器端徹底同樣,沒有本質的區別。
•C/S結構和B/S結構是如今網絡編程中常見的兩種結構,B/S結構其實也就是一種特殊的C/S結構。
•P2P程序是一種特殊的程序,應該一個P2P程序中既包含客戶端程序,也包含服務器端程序,例如BT,使用客戶端程序部分鏈接其它的種子(服務器端),而使用服務器端向其它的BT客戶端傳輸數據。
•和網絡編程有關的基本API位於java.net包中,該包中包含了基本的網絡編程實現,該包是網絡編程的基礎。該包中既包含基礎的網絡編程類,也包含封裝後的專門處理WEB相關的處理類。
•在Java語言中,對於TCP方式的網絡編程提供了良好的支持,在實際實現時,以java.net.Socket類表明客戶端鏈接,以java.net.ServerSocket類表明服務器端鏈接。在進行網絡編程時,底層網絡通信的細節已經實現了比較高的封裝,因此在程序員實際編程時,只須要指定IP地址和端口號碼就能夠創建鏈接了。正是因爲這種高度的封裝,一方面簡化了Java語言網絡編程的難度,另外也使得使用Java語言進行網絡編程時沒法深刻到網絡的底層,因此使用Java語言進行網絡底層系統編程很困難,具體點說,Java語言沒法實現底層的網絡嗅探以及得到IP包結構等信息。可是因爲Java語言的網絡編程比較簡單,因此仍是得到了普遍的使用。
•下面是一個簡單的網絡客戶端程序示例,該程序的做用是向服務器端發送一個字符串「Hello」,並將服務器端的反饋顯示到控制檯,數據交換隻進行一次,當數據交換進行完成之後關閉網絡鏈接,程序結束。
import java.io.; import java.net.; public class SimpleSocketClient { public static void main(String[] args) { Socket socket = null; InputStream is = null; OutputStream os = null; //服務器端IP地址 String serverIP = "127.0.0.1"; //服務器端端口號 int port = 10000; //發送內容 String data = "Hello"; try { //創建鏈接 socket = new Socket(serverIP,port); //發送數據 os = socket.getOutputStream(); os.write(data.getBytes()); //接收數據 is = socket.getInputStream(); byte[] b = new byte[1024]; int n = is.read(b); //輸出反饋數據 System.out.println("服務器反饋:" + new String(b,0,n)); } catch (Exception e) { e.printStackTrace(); //打印異常信息 }finally{ try { //關閉流和鏈接 is.close(); os.close(); socket.close(); } catch (Exception e2) {} } } }
•網絡協議是指對於網絡中傳輸的數據格式的規定。對於網絡編程初學者來講,沒有必要深刻了解TCP/IP協議簇,因此對於初學者來講去讀大部頭的《TCP/IP協議》也不是一件很合適的事情,由於深刻了解TCP/IP協議是網絡編程提升階段,也是深刻網絡編程底層時才須要作的事情。
•這就是一種雙方達成的一種協議約定,其實這種約定的實質和網絡協議的實質是同樣的。網絡協議的實質也是客戶端程序和服務器端程序對於數據的一種約定,只是因爲以計算機爲基礎,因此更多的是使用數字來表明內容,這樣就顯得比較抽象一些。
客戶端程序須要完成的處理爲:
一、 客戶端發送協議格式的生成
二、 服務器端反饋數據格式的解析
服務器端程序須要完成的處理爲:
一、 服務器端反饋協議格式的生成
二、 客戶端發送協議格式的解析
這周任務已經不在是課本上的知識了,更多的是生活中應用的問題,對我來講仍是頗有興趣的,努力就會有收穫。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 4000行 | 20篇 | 300小時 | |
第一週 | 100/100 | 1/1 | 15/15 | |
第二週 | 300/400 | 1/2 | 25/40 | |
第三週 | 500/900 | 1/3 | 35/75 | |
第四周 | 400/1300 | 1/4 | 30/105 | |
第五週 | 500/1800 | 1/5 | 35/140 | |
第六週 | 400/2200 | 2/7 | 30/170 | |
第七週 | 300/2500 | 2/9 | 30/200 | |
第八週 | 300/2800 | 2/11 | 30/230 | |
第九周 | 400/3200 | 2/13 | 30/260 | |
第十週 | 300/3500 | 2/15 | 20/280 |