網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。程序員
•程序員所做的事情就是把數據發送到指定的位置,或者接收到指定的數據,這個就是狹義的網絡編程範疇。編程
•在發送和接收數據時,大部分的程序設計語言都設計了專門的API實現這些功能,程序員只須要調用便可。數組
網絡概述瀏覽器
•網絡編程就是兩個或多個設備(程序)之間的數據交換。服務器
•識別網絡上的每一個設備:網絡
•IP地址:每一個計算機在聯網之後都擁有一個惟一的合法IP地址,就像手機號,在計算機網絡中,如今命名IP地址的規定是IPv4協議,該協議規定每一個IP地址由4個0-255之間的數字組成。這個IP地址多是動態的,也多是固定的。編碼
•域名(Domain Name)。計算機網絡
•一個IP地址能夠對應多個域名,一個域名只能對應一個IP地址。線程
•DNS服務器:在網絡中傳輸的數據,所有是以IP地址做爲地址標識,因此在實際傳輸數據之前須要將域名轉換爲IP地址,實現這種功能的服務器稱之爲DNS服務器,也就是通俗的說法叫作域名解析。 當DNS服務器正常工做時,使用IP地址或域名均可以很方便的找到計算機網絡中的某個設備,例如服務器計算機。當DNS不正常工做時,只能經過IP地址訪問該設備。設計
•C/S結構:網絡編程的結構被稱做客戶端/服務器結構,也叫作Client/Server結構。
•B/S結構:使用瀏覽器做爲客戶端的結構被稱做瀏覽器/服務器結構,也叫作Browser/Server結構。B/S結構其實也就是一種特殊的C/S結構。
•P2P程序:P2P程序中既包含客戶端程序,也包含服務器端程序,是一種特殊的程序。
•端口:讓一個計算機能夠同時運行多個網絡程序。端口的號碼必須位於0-65535之間,每一個端口惟一的對應一個網絡程序,一個網絡程序可使用多個端口。
•協議(Protocol):在實際進行數據交換時,爲了讓接收端理解該數據,須要規定該數據的格式,這個數據的格式就是協議。
•如何來編寫協議格式:只要按照這種協議格式可以生成惟一的編碼,按照該編碼能夠惟一的解析出發送數據的內容便可。也正由於各個網絡程序之間協議格式的不一樣,因此才致使了客戶端程序都是專用的結構。
•在現有的網絡中,網絡通信的方式主要有兩種:
•TCP(傳輸控制協議)方式:進行網絡通信時,須要創建專門的虛擬鏈接,而後進行可靠的數據傳輸,若是數據發送失敗,則客戶端會自動重發該數據。
•UDP(用戶數據報協議)方式:進行網絡通信時,不須要創建專門的虛擬鏈接,傳輸也不是很可靠,若是發送失敗則客戶端沒法得到。
•網絡編程的通常有兩種結構:
•客戶端/服務器結構,也叫作Client/Server結構,簡稱C/S結構。優勢是表現力豐富,缺點是通用性差、維護的壓力比較大。
•瀏覽器/服務器結構,也叫作Browser/Server結構,簡稱爲B/S結構。優勢是開發的壓力比較小,不須要維護客戶端。缺點是限制比較大,表現力不強,沒法進行系統級操做等。
網絡編程技術
•客戶端的編程主要由三個步驟實現:
•創建網絡鏈接:在創建網絡鏈接時須要指定鏈接到的服務器的IP地址和端口號,創建完成之後,會造成一條虛擬的鏈接,後續的操做就能夠經過該鏈接實現數據交換了。
•交換數據:鏈接創建之後,就能夠經過這個鏈接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到服務器,服務器反饋一個響應數據給客戶端,若是客戶端不發送請求則服務器端就不響應。根據邏輯須要,能夠屢次交換數據,可是仍是必須遵循請求響應模型。
•關閉網絡鏈接:在數據交換完成之後,關閉網絡鏈接,釋放程序佔用的端口、內存等系統資源,結束網絡編程。
•服務器端網絡編程步驟:
•監聽端口:服務器端屬於被動等待鏈接,因此服務器端啓動之後,不須要發起鏈接,而只須要監聽本地計算機的某個固定端口便可。這個端口就是服務器端開放給客戶端的端口,服務器端程序運行的本地計算機的IP地址就是服務器端程序的IP地址。
•得到鏈接:當客戶端鏈接到服務器端時,服務器端就能夠得到一個鏈接,這個鏈接包含客戶端的信息,服務器端和客戶端也經過該鏈接進行數據交換。通常在服務器端編程中,當得到鏈接時,須要開啓專門的線程處理該鏈接,每一個鏈接都由獨立的線程實現。
•交換數據:服務器端經過得到的鏈接進行數據交換。服務器端的數據交換步驟是首先接收客戶端發送過來的數據,而後進行邏輯處理,再把處理之後的結果數據發送給客戶端。這個和客戶端的數據交換數序不一樣。服務器端得到的鏈接和客戶端鏈接是同樣的,只是數據交換的步驟不一樣。固然,服務器端的數據交換也是能夠屢次進行的。在數據交換完成之後,關閉和客戶端的鏈接。
•關閉鏈接:當服務器程序關閉時,須要關閉服務器端,經過關閉服務器端使得服務器監聽的端口以及佔用的內存能夠釋放出來,實現了鏈接的關閉。
•實現服務器端監聽的代碼爲:
ServerSocket ss = new ServerSocket(10000);
•實現UDP方式的編程,包含客戶端網絡編程和服務器端網絡編程,主要由兩個類實現,分別是:
•DatagramSocket:實現「網絡鏈接」,包括客戶端網絡鏈接和服務器端網絡鏈接。DatagramSocket實現的就是發送數據時的發射器,以及接收數據時的監聽器的角色。類比於TCP中的網絡鏈接,該類既能夠用於實現客戶端鏈接,也能夠用於實現服務器端鏈接。
•DatagramPacket:實現對於網絡中傳輸的數據封裝,該類的對象表明網絡中交換的數據。在UDP方式的網絡編程中,不管是須要發送的數據仍是須要接收的數據,都必須被處理成DatagramPacket類型的對象,該對象中包含發送到的地址、發送到的端口號以及發送的內容等。和TCP方式的網絡傳輸相比,IO編程在UDP方式的網絡編程中變得不是必須的內容,結構也要比TCP方式的網絡編程簡單一些。
•InetAddress類:該類的功能是表明一個IP地址,而且將IP地址和域名相關的操做方法包含在該類的內部。
DatagramSocket:實現「網絡鏈接」,包括客戶端網絡鏈接和服務器端網絡鏈接。雖然UDP方式的網絡通信不須要創建專用的網絡鏈接,可是畢竟仍是須要發送和接收數據,DatagramSocket實現的就是發送數據時的發射器,以及接收數據時的監聽器的角色。類比於TCP中的網絡鏈接,該類既能夠用於實現客戶端鏈接,也能夠用於實現服務器端鏈接。
•DatagramPacket:實現對於網絡中傳輸的數據封裝。在UDP方式的網絡編程中,不管是須要發送的數據仍是須要接收的數據,都必須被處理成DatagramPacket類型的對象,該對象中包含發送到的地址、發送到的端口號以及發送的內容等。其實DatagramPacket類的做用相似於現實中的信件,在信件中包含信件發送到的地址以及接收人,還有發送的內容等,郵局只須要按照地址傳遞便可。在接收數據時,接收到的數據也必須被處理成DatagramPacket類型的對象,在該對象中包含發送方的地址、端口號等信息,也包含數據的內容。和TCP方式的網絡傳輸相比,IO編程在UDP方式的網絡編程中變得不是必須的內容,結構也要比TCP方式的網絡編程簡單一些。 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); //構造緩衝數組 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);