【原】Java學習筆記034 - 網絡
阿新 • • 發佈:2018-08-09
端口號 bre throws clas 編程 綁定 容器 名稱 套接字
1 package cn.temptation; 2 3 import java.net.InetAddress; 4 5 public class Sample01 { 6 public static void main(String[] args) throws Exception { 7 /* 8 * OSI模型:Open System Interconnection,開放系統互聯 9 * 分為七層:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層 10 *11 * TCP/IP模型: 12 * 分為四層:應用層、傳輸層、網際層、主機至網絡層 13 * 14 * OSI模型的會話層、表示層、應用層 對應 TCP/IP模型的應用層 15 * OSI模型的傳輸層 對應 TCP/IP模型的傳輸層 16 * OSI模型的網絡層 對應 TCP/IP模型的網際層 17 * OSI模型的物理層、數據鏈路層 對應 TCP/IP模型的主機至網絡層18 * 19 * 常用協議: 20 * 應用層:HTTP協議、HTTPS協議、FTP協議 21 * 傳輸層:TCP協議、UDP協議 22 * 網絡層:IP協議 23 * 24 * 網絡編程的三要素:地址、端口、協議 25 * 類比:人 和 人 的交流 26 * 27 * 類 InetAddress:此類表示互聯網協議 (IP) 地址。 28 * 29 * InetAddress類的常用成員方法:30 * 1、static InetAddress getByName(String host):在給定主機名的情況下確定主機的 IP 地址。 31 * 2、String getHostName():獲取此IP地址的主機名。 32 * 3、String getHostAddress():返回 IP地址字符串(以文本表現形式)。 33 */ 34 35 // 命令行窗口下輸出hostname,可以查看到本機的名稱 36 InetAddress address = InetAddress.getByName("temptation"); 37 System.out.println(address); // temptation/192.168.137.2 38 39 String hostname = address.getHostName(); 40 System.out.println(hostname); // temptation 41 42 String ip = address.getHostAddress(); 43 System.out.println(ip); // 192.168.137.2 44 } 45 }
1 package cn.temptation; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 8 public class Sample02 { 9 public static void main(String[] args) throws IOException { 10 /* 11 * 傳輸協議:人們為了通信而制定的規則 12 * 常用協議:UDP、TCP 13 * 14 * 套接字Socket的機制: 15 * 1、進行通信的雙方都有Socket 16 * 2、網絡通信實際是Socket之間的通信 17 * 3、數據在Socket之間通過IO流進行傳輸 18 * 19 * Java語言中對UDP協議使用Socket進行了封裝,提供了DatagramPacket類 和 DatagramSocket類 20 * 21 * 類 DatagramPacket:數據報包用來實現無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。 22 * 從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。 23 * 24 * DatagramPacket類的常用構造函數: 25 * 1、DatagramPacket(byte[] buf, int length):構造 DatagramPacket,用來接收長度為 length 的數據包。 26 * 2、DatagramPacket(byte[] buf, int length, InetAddress address, int port):構造數據報包,用來將長度為 length 的包發送到指定主機上的指定端口號。 27 * 28 * 類 DatagramSocket:此類表示用來發送和接收數據報包的套接字。 29 * 數據報套接字是包投遞服務的發送或接收點。每個在數據報套接字上發送或接收的包都是單獨編址和路由的。 30 * 從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。 31 * 在 DatagramSocket上總是啟用 UDP 廣播發送。為了接收廣播包,應該將DatagramSocket綁定到通配符地址。 32 * 在某些實現中,將 DatagramSocket綁定到一個更加具體的地址時廣播包也可以被接收。 33 * 34 * DatagramSocket類的常用成員方法: 35 * 1、void send(DatagramPacket p):從此套接字發送數據報包。 36 * 2、void close():關閉此數據報套接字。 37 * 38 * UDP協議的發送數據: 39 * 1、創建發送端Socket對象 40 * 2、創建數據,把數據進行打包 41 * 3、調用Socket對象的發送方法發送數據包 42 * 4、釋放資源 43 */ 44 45 // 1、創建發送端Socket對象 46 DatagramSocket ds = new DatagramSocket(); 47 48 // 2、創建數據,把數據進行打包 49 // A:創建數據 50 byte[] arr = ("Hello, UDP").getBytes(); 51 // B:獲取地址對象 52 InetAddress address = InetAddress.getByName("temptation"); 53 // C:打包數據 54 DatagramPacket dp = new DatagramPacket(arr, arr.length, address, 1234); 55 56 // 3、調用Socket對象的發送方法發送數據包 57 ds.send(dp); 58 59 // 4、釋放資源 60 ds.close(); 61 } 62 }
1 package cn.temptation; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 8 public class Sample03 { 9 public static void main(String[] args) throws IOException { 10 /* 11 * DatagramSocket類的常用構造函數: 12 * DatagramSocket(int port):創建數據報套接字並將其綁定到本地主機上的指定端口。 13 * 14 * DatagramSocket類的常用成員方法: 15 * 1、void receive(DatagramPacket p):從此套接字接收數據報包。 16 * 17 * DatagramPacket類的常用成員方法: 18 * 1、byte[] getData():返回數據緩沖區。 19 * 2、int getLength():返回將要發送或接收到的數據的長度。 20 * 3、InetAddress getAddress():返回某臺機器的 IP 地址,此數據報將要發往該機器或者是從該機器接收到的。 21 * 22 * UDP協議的接收數據: 23 * 1、創建接收端Socket對象 24 * 2、創建一個數據包接收容器 25 * 3、調用Socket對象的接收方法進行接收 26 * 4、釋放資源 27 */ 28 29 // 1、創建接收端Socket對象 30 DatagramSocket ds = new DatagramSocket(1234); 31 32 // 2、創建一個數據包接收容器 33 byte[] arr = new byte[1024]; 34 DatagramPacket dp = new DatagramPacket(arr, arr.length); 35 36 // 3、調用Socket對象的接收方法進行接收 37 ds.receive(dp); 38 39 // 獲取到的數據包內容可以使用 40 byte[] temp = dp.getData(); 41 int length = dp.getLength(); 42 String result = new String(temp, 0, length); 43 InetAddress address = dp.getAddress(); 44 45 System.out.println(address.getHostAddress() + "接收到的數據為:" + result); 46 47 // 4、釋放資源 48 ds.close(); 49 } 50 }
1 package cn.temptation; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.net.DatagramPacket; 7 import java.net.DatagramSocket; 8 import java.net.InetAddress; 9 10 public class Sample04 { 11 public static void main(String[] args) throws IOException { 12 // 需求:基於UDP協議,實現從鍵盤錄入內容進行發送,如果輸入886,則發送端結束輸入;發送內容在接收端顯示出來 13 14 // 發送端 15 16 // 創建Socket對象 17 DatagramSocket ds = new DatagramSocket(); 18 19 // 鍵盤輸入的標準輸入流進行封裝 20 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 21 22 String temp = null; 23 24 while ((temp = reader.readLine()) != null) { 25 if ("886".equals(temp)) { // 終止循環 26 break; 27 } else { 28 // 創建發送數據並打包 29 byte[] arr = temp.getBytes(); 30 InetAddress address = InetAddress.getByName("temptation"); 31 DatagramPacket dp = new DatagramPacket(arr, arr.length, address, 1234); 32 33 // 發送 34 ds.send(dp); 35 } 36 } 37 38 // 釋放資源 39 ds.close(); 40 } 41 }
1 package cn.temptation; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 8 public class Sample05 { 9 public static void main(String[] args) throws IOException { 10 // 需求:基於UDP協議,實現從鍵盤錄入內容進行發送,如果輸入886,則發送端結束輸入;發送內容在接收端顯示出來 11 12 // 接收端 13 14 // 創建接收端的Socket對象 15 DatagramSocket ds = new DatagramSocket(1234); 16 17 // 創建一個數據包接收容器 18 byte[] arr = new byte[1024]; 19 DatagramPacket dp = new DatagramPacket(arr, arr.length); 20 21 // 接收數據 22 ds.receive(dp); 23 24 // 獲取到的數據包內容可以使用 25 byte[] temp = dp.getData(); 26 int length = dp.getLength(); 27 String result = new String(temp, 0, length); 28 InetAddress address = dp.getAddress(); 29 30 System.out.println(address.getHostAddress() + "接收到的數據為:" + result); 31 32 // 釋放資源 33 ds.close(); 34 } 35 }
1 package cn.temptation; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.net.InetAddress; 6 import java.net.Socket; 7 8 public class Sample06 { 9 public static void main(String[] args) throws IOException { 10 /* 11 * Java語言對TCP協議的使用封裝了Socket,提供了:Socket類 和 ServerSocket類 12 * 13 * 類 Socket:實現客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器間通信的端點。 14 * 套接字的實際工作由 SocketImpl 類的實例執行。 15 * 應用程序通過更改創建套接字實現的套接字工廠可以配置它自身,以創建適合本地防火墻的套接字。 16 * 17 * Socket類的常用構造函數: 18 * 1、Socket(InetAddress address, int port):創建一個流套接字並將其連接到指定 IP 地址的指定端口號。 19 * 2、Socket(String host, int port):創建一個流套接字並將其連接到指定主機上的指定端口號。 20 * 21 * Socket類的常用成員方法: 22 * 1、OutputStream getOutputStream():返回此套接字的輸出流。 23 * 2、InputStream getInputStream():返回此套接字的輸入流。 24 * 3、void close():關閉此套接字。 25 * 26 * 類 ServerSocket:實現服務器套接字。服務器套接字等待請求通過網絡傳入。它基於該請求執行某些操作,然後可能向請求者返回結果。 27 * 服務器套接字的實際工作由 SocketImpl 類的實例執行。 28 * 應用程序可以更改創建套接字實現的套接字工廠來配置它自身,從而創建適合本地防火墻的套接字。 29 * 30 * ServerSocket類的常用構造函數: 31 * 1、ServerSocket(int port):創建綁定到特定端口的服務器套接字。 32 * 33 * ServerSocket類的常用成員方法: 34 * 1、Socket accept():偵聽並接受到此套接字的連接。 35 * 2、void close():關閉此套接字。 36 * 37 * TCP協議的發送數據:(客戶端) 38 * 1、創建客戶端的Socket對象 39 * 2、獲取輸出流,寫出數據 40 * 3、釋放資源 41 */ 42 43 // 1、創建客戶端的Socket對象 44 Socket socket = new Socket(InetAddress.getByName("temptation"), 1234); 45 46 // 2、獲取輸出流,寫出數據 47 OutputStream os = socket.getOutputStream(); 48 os.write("Hello TCP".getBytes()); 49 50 // 3、釋放資源 51 socket.close(); 52 53 // 註意: 54 // TCP的客戶端沒有連接服務端時執行,會產生執行異常:java.net.ConnectException: Connection refused: connect 55 // UDP的發送端沒有接收端時執行,不會產生執行異常 56 // 理解:TCP類似打電話(沒有對應號碼時提示是空號或是不存在),UDP類似廣播(喊一嗓子,聽見了就聽見了,沒聽見就沒聽見) 57 } 58 }
1 package cn.temptation; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class Sample07 { 9 public static void main(String[] args) throws IOException { 10 /* 11 * TCP協議的接收數據:(服務端) 12 * 1、創建服務端的Socket對象 13 * 2、監聽客戶端的連接,返回一個對應的Socket對象 14 * 3、獲取輸入流 15 * 4、釋放資源 16 */ 17 18 // 1、創建服務端的Socket對象 19 ServerSocket serverSocket = new ServerSocket(1234); 20 21 // 2、監聽客戶端的連接,返回一個對應的Socket對象 22 // 監聽客戶端的連接,如果沒有客戶端連接時,一直阻塞 23 Socket socket = serverSocket.accept(); 24 25 // 3、獲取輸入流 26 InputStream is = socket.getInputStream(); 27 28 byte[] arr = new byte[1024]; 29 int length = is.read(arr); 30 String result = new String(arr, 0, length); 31 32 System.out.println("接收到的內容為:" +result); 33 34 // 4、釋放資源 35 socket.close(); 36 serverSocket.close(); 37 } 38 }
1 package cn.temptation; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.net.Socket; 9 10 public class Sample08 { 11 public static void main(String[] args) throws IOException { 12 // 需求:基於TCP協議,實現從鍵盤錄入內容進行發送,如果輸入886,則客戶端結束輸入;發送內容在服務端顯示出來 13 14 // 客戶端 15 16 // 創建客戶端Socket對象 17 Socket socket = new Socket("temptation", 1234); 18 19 // 鍵盤錄入數據 20 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 21 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 22 23 String temp = null; 24 25 while ((temp = reader.readLine()) != null) { 26 if ("886".equals(temp)) { 27 break; 28 } else { 29 writer.write(temp); 30 writer.newLine(); 31 writer.flush(); 32 } 33 } 34 35 // 釋放資源 36 writer.close(); 37 reader.close(); 38 socket.close(); 39 } 40 }
1 package cn.temptation; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 9 public class Sample09 { 10 public static void main(String[] args) throws IOException { 11 // 需求:基於TCP協議,實現從鍵盤錄入內容進行發送,如果輸入886,則客戶端結束輸入;發送內容在服務端顯示出來 12 13 // 服務端 14 15 // 創建服務端Socket對象 16 ServerSocket serverSocket = new ServerSocket(1234); 17 18 // 監聽連接 19 Socket socket = serverSocket.accept(); 20 21 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 22 23 String temp = null; 24 25 while ((temp = reader.readLine()) != null) { 26 System.out.println("接收的內容為:" + temp); 27 } 28 29 // 釋放資源 30 reader.close(); 31 socket.close(); 32 serverSocket.close(); 33 } 34 }
【原】Java學習筆記034 - 網絡