1. 程式人生 > >【原】Java學習筆記034 - 網絡

【原】Java學習筆記034 - 網絡

端口號 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 - 網絡