在操做系統中,網絡和文件其實都是經過I/O總線鏈接到系統。都會有一個定位類,例如:file和Url,而後再經過input,output等I/O類才進行數據交互。本文介紹下java的網絡,及其相關類。java
不一樣設備之間、不一樣進程之間的通訊都是須要通訊協議來格式化數據、分裝,而後組裝數據、反格式化數據。算法
a) 7層協議:數據庫
整體劃分:編程
ISO提出的OSI(Open System Interconnection)模型將網絡分爲七層,即 物理層( Physical )、 數據鏈路層(Data Link)、網絡層(Network)、 傳輸層(Transport)、 會話層(Session)、 表示層(Presentation)和 應用層(Application)。瀏覽器
1. 物理層服務器
物理層(Physical layer)是參考模型的最低層。該層是網絡通訊的數據傳輸介質,由鏈接不一樣結點的電纜與設備共同構成。主要功能是:利用傳輸介質爲數據鏈路層提供物理鏈接,負責處理數據傳輸並監控數據出錯率,以便數據流的透明傳輸。網絡
2. 數據鏈路層socket
數據鏈路層(Data link layer)是參考模型的第2層。 主要功能是:在物理層提供的服務基礎上,在通訊的實體間創建數據鏈路鏈接,傳輸以「幀」爲單位的數據包,並採用差錯控制與 流量控制方法,使有差錯的物理線路變成無差錯的數據鏈路。tcp
3. 網絡層加密
網絡層(Network layer)是參考模型的第3層。主要功能是:爲數據在結點之間傳輸建立邏輯鏈路,經過路由選擇算法爲分組經過通訊子網選擇最適當的路徑,以及實現擁塞控制、 網絡互聯等功能。
4. 傳輸層
傳輸層(Transport layer)是參考模型的第4層。主要功能是向用戶提供可靠的端到端(End-to-End)服務,處理數據包錯誤、數據包次序,以及其餘一些關鍵傳輸問題。傳輸層向高層屏蔽了下層數據通訊的細節,所以,它是計算機通訊體系結構中關鍵的一層。
5. 會話層
會話層(Session layer)是參考模型的第5層。主要功能是:負責維擴兩個結點之間的傳輸連接,以便確保點到點傳輸不中斷,以及管理數據交換等功能。
6. 表示層
表示層(Presentation layer)是參考模型的第6層。主要功能是:用於處理在兩個通訊系統中交換信息的表示方式,主要包括數據格式變換、 數據加密與解密、數據壓縮與恢復等功能。
7. 應用層
應用層(Application layer)是參考模型的最高層。主要功能是:爲 應用軟件提供了不少服務,例如文件服務器、數據庫服務、 電子郵件與其餘網絡軟件服務。
b) 5層協議
名稱 | 功能 | 協議 |
應用層 | 文件傳輸、電子郵件、文件服務、虛擬終端 | TFTP(文件傳輸)、HTTP(萬維網)、SNMP、FTP、SMTP、DNS、Telnet(遠程終端接入) |
傳輸層 | 提供端對端的接口 | TCP、UDP |
網絡層 | 爲數據包選擇路由 | IP、ICMP、OSPF、EIGRP、Lgmp |
數據鏈路層 | 傳送有地址的幀以及錯誤檢測功能 | SLIP、CSLIP、PPP、MTU |
物理層 | 以二進制數據形式在物理媒體上傳輸數據 | ISO21十、IEEE80二、IEEE802.2 |
c) TCP數據封裝
tcp封裝數據包的格式爲:
數據幀:幀頭+IP數據包+幀尾 (幀頭包括源和目標主機MAC地址及類型,幀尾是校驗字)
IP數據包:IP頭部+TCP數據信息(IP頭包括源和目標主機IP地址、類型、生存期等)
TCP數據信息:TCP頭部+實際數據 (TCP頭包括源和目標主機端口號、順序號、確認號、校驗字等)
d) tcp鏈接《3次握手爲主》
tcp的3次握手
tcp的4次握手
java.net.InetAddress:ip處理類,將域名或者IP解析爲 ip/域名的形式。
java.net.URL:網絡鏈接類。封裝了InetAddress和系統網絡鏈接。處理鏈接問題,和File類對文件的做用類似。
java.net.URLConnection:網絡處理類,鏈接後處理數據交互等功能。
java.net.ServerSocket:服務器
java.net.Socket:
/** * @throws Exception * @see 域名處理:返回域名/IP */ @Test public void intAddress() throws Exception { InetAddress local = InetAddress.getLocalHost(); System.out.println("本地IP:" + local.getHostAddress());//本地IP:192.168.124.1 System.out.println("本地名稱:" + local.getHostName());//本地名稱:ssHss-PC InetAddress[] local2 = InetAddress.getAllByName("www.baidu.com");//IP180.97.33.108 for (InetAddress ia : local2) { System.out.println("IP" + ia.getHostAddress()); System.out.println("名稱" + ia.getHostName()); //IP:180.97.33.108 //名稱:www.baidu.com //IP:180.97.33.107 //名稱:www.baidu.com } }
/** * @throws Exception * @see URLConnection * @see 域名類:URL、處理鏈接前的工做(協議、域名、IP、端口、鏈接) * @See 鏈接處理類類:URLConnection、處理鏈接後的工做(讀寫) */ public void testURL() throws Exception { // 域名 String urlPath = "http://www.baidu.com"; // 生成 URL類 URL url = new URL(urlPath); // 鏈接 URLConnection urlconn = url.openConnection(); System.out.println("========== head ==========="); Map<String, List<String>> map = urlconn.getHeaderFields(); for (Entry<String, List<String>> entry : map.entrySet()) { String key = entry.getKey(); List<String> value = entry.getValue(); System.out.println(key + " : " + value); } System.out.println("========== inputStream ================"); InputStream urlinput = urlconn.getInputStream(); /** * 以字符 */ BufferedReader r = new BufferedReader(new InputStreamReader(urlinput)); String readLine = null; int line = 1; while ((readLine = r.readLine()) != null) { System.out.println(line + " :" + readLine); line++; } /** * 以字節 */ // byte[] tempBytes = new byte[100]; // int byteRead = 0; // while ((byteRead = urlinput.read(tempBytes)) != -1) { // System.out.println(tempBytes); // } }
鏈接www.baidu.com獲取的信息:
瀏覽器截圖
console打印圖:
a) 監聽80端口:
/** * @throws IOException * @see severSocket :服務器Socket * @see socket:網絡處理對象 */ @Test public void serviceSocket() throws IOException { // 建立ServerSocket(端口) ServerSocket server = new ServerSocket(8080); // 監聽--》阻塞(等待鏈接) Socket socket = server.accept(); // 處理數據 BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream())); String readline = null; while ((readline = buffer.readLine()) != null) { System.out.println(readline); } }
Console圖
browers圖
b) Server-Clinet實例
server-socket: /** * @throws IOException * @see severSocket :服務器Socket * @see socket:網絡處理對象 */ @Test public void serviceSocket() throws IOException { // 建立ServerSocket(端口) ServerSocket server = new ServerSocket(8080); // 監聽--》阻塞(等待鏈接) Socket socket = server.accept(); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); System.out.println("========== server-write ==========="); out.println("你好!--我是server"); // 處理數據 BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream())); String readline = null; System.out.println("========== server-read ==========="); while ((readline = buffer.readLine()) != null) { System.out.println(readline); } out.close(); socket.close(); } client: /** * @throws IOException * @See clientSocket */ @Test public void clientSocket() throws Exception { Socket s = new Socket("localhost", 8080); PrintWriter out = new PrintWriter(s.getOutputStream(), true); System.out.println("========== client-write ==========="); out.println("你好!..我是client"); BufferedReader buffer = new BufferedReader(new InputStreamReader(s.getInputStream())); String readline = null; System.out.println("========== client-read ==========="); while ((readline = buffer.readLine()) != null) { System.out.println(readline); } out.close(); s.close(); }