java複習第9天---9.2---網絡編程---TCP網絡編程
目錄
內容
1、概述
TCP通信實現兩臺計算機之間的數據交互,通信的兩端,要嚴格區分爲客戶端(client)與服務端(Server)。
- 兩端通信時不走:
- 服務端程序,需要實現啓動,等待客戶端的連接。
- 客戶端主動連接服務端,連接成功才能通信。服務端不可以主動連接客戶端。
在Java中,提供了兩個類用於實現TCP通信程序:
- 客戶端:java.net.Socket類表示。創建Socket對象,向服務端發送連接請求,服務端響應請求,兩者建立連接,開始通信
- 服務端:java.net.ServerSocket類表示。創建ServerSocket對象,相當於開啓一個服務,並等待客戶端的連接。
2、Socket類
Socket類:該類實現客戶端套接字,套接字指的是兩臺設備之間通訊的端點。
- 常用構造方法
參數列表 | 描述 |
---|---|
String host, int port | 創建套接字並將其連接到指定主機的指定端口號。如果host爲null,則相當於指定地址爲回送地址。 |
-
舉例:
Socket client = new Socket("127.0.0.1", 666);
-
常用成員方法
修飾符 | 返回值類型 | 方法名 | 參數列表 | 描述 |
---|---|---|---|---|
public | OutputStream | getOutputStream | 返回此套接字的輸出流 | |
public | InputStream | getInputStream | 返回此套接字的輸入流 | |
public | void | close | 關閉此套接字,釋放資源 |
-
實現步驟:
- 創建客戶端Socket對象,構造方法綁定服務器的IP地址和端口號
- 調用Socket對象的getOutputStream方法,獲取網絡輸出流,把數據寫入網絡輸出流中,傳輸給服務器
- 調用Scoket對象的getInputStream方法,獲取網絡輸入流,從中讀取服務器返回的數據
- 關閉Socket對象,釋放資源
-
注意事項:
- 客戶端和服務器進行交互,必須使用Socket中提供的網絡流,不能使用自己創建的流對象
- 當我們創建客戶端Socket對象時,就會區請求服務器,通過3次握手建立連接。當服務器沒有啓動時,會拋出連接異常;如果服務器啓動就看可以進行通信
-
示例2-1:
package net.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class TestSocket1 { public static void main(String[] args) throws UnknownHostException, IOException { // 1、創建客戶端Socket對象,綁定服務器IP和端口號 Socket client = new Socket("127.0.0.1", 8888); // 2、通過Socket對象的getOutputStream方法獲取網絡輸出流 OutputStream out = (OutputStream) client.getOutputStream(); // 3、通過網絡輸出流向服務器發送數據 out.write("你那裏有HelloWorld.java嗎".getBytes()); // 4、通過Socket對象的getInputStream獲取網絡輸入流 InputStream is = client.getInputStream(); // 5、使用網絡輸入流讀取服務器返回的數據 byte[] b = new byte[1024]; int len = is.read(b); // 6、處理返回的數據 System.out.println(new String(b, 0, len)); // 7、關閉Socket對象,釋放資源 client.close(); } } 測試結果:服務端沒有啓動 Exception in thread "main" java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ...
3、服務端
TCP通信服務器:等待客戶端連接,獲取客戶端發送的數據並處理,返回響應數據。
java.net.ServerSocket次類實現服務端套接字。
- 構造方法
參數列表 | 描述 |
---|---|
int port | 創建綁定到指定端口的套接字 |
- 成員方法
修飾符 | 返回值類型 | 方法名 | 參數列表 | 描述 |
---|---|---|---|---|
public | Socket | accept | 偵聽連接到此的套接字並接收 |
-
實現步驟:
- 創建ServerSocket服務端套接字,並通過構造方法綁定到指定的端口
- 調用ServerSocket 的accept方法等待客戶端套接字的連接並獲取套接字
- 調用上一步的得到的Socket對象的getInputStream獲取網絡輸入流
- 調用網絡輸入流的read方法獲取客戶端傳入的數據
- 處理客戶的傳入的數據,生成響應數據
- 調用Socket對象的getOutputStream獲取網絡輸出流
- 調用網絡輸出流的write方法,把相應數據返回給客戶端
- 關閉Socket和ServerSocket對象,釋放資源
-
示例3-1:
package io.stream.print; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; public class TestServer1 { public static void main(String[] args) throws IOException { // 1. 創建ServerSocket服務端套接字,並通過構造方法綁定到指定的端口 ServerSocket server = new ServerSocket(8888); // 2. 調用ServerSocket 的accept方法等待客戶端套接字的連接並獲取套接字 Socket socket = server.accept(); // 3. 調用上一步的得到的Socket對象的getInputStream獲取網絡輸入流 InputStream is = socket.getInputStream(); // 4. 調用網絡輸入流的read方法獲取客戶端傳入的數據 byte[] b = new byte[1024]; int len = is.read(b); // 5. 處理客戶的傳入的數據,生成響應數據 System.out.println(new String(b, 0, len)); String resp = "我這裏有,順着網線過來拿把"; // 6. 調用Socket對象的getOutputStream獲取網絡輸出流 OutputStream os = socket.getOutputStream(); // 7. 調用網絡輸出流的write方法,把相應數據返回給客戶端 os.write(resp.getBytes()); // 8. 關閉Socket和ServerSocket對象,釋放資源 socket.close(); server.close(); } } 測試結果: 客戶端輸出:我這裏有,順着網線過來拿把 服務端輸出:你那裏有HelloWorld.java嗎
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA