Java 中通信接口
- 1、Java UDP 通信核心接口介紹
- 1、DatagramSocket 類
- 2、DatagramPacket 類
- 3、UDP客戶端與UDP服務器通信例子
- 2、Java TCP 通信核心接口介紹
- 1、ServerSocket 類
- 2、Socket 類
- 3、輸入輸出流常見包裝類
- 4、TCP 客戶端與 TCP 服務器通信例子
Java 網絡通信基于 Socket(套接字) 編程,分為兩大類:
協議 | 類 | 特點 |
---|---|---|
TCP | Socket , ServerSocket | 面向連接、可靠、數據順序、有流控制 |
UDP | DatagramSocket , DatagramPacket | 無連接、不可靠、快速、無序、面向數據報 |
1、Java UDP 通信核心接口介紹
你這個程序使用的是 UDP 協議,使用類有:
DatagramSocket:用于發送和接收數據包(Socket 實例)
DatagramPacket:用于封裝發送或接收的數據內容
1、DatagramSocket 類
這個類代表一個 UDP 套接字(Socket),可以發送或接收 DatagramPacket。
DatagramSocket socket = new DatagramSocket(); // 客戶端:系統自動分配本地端口
DatagramSocket socket = new DatagramSocket(port); // 服務器:綁定到指定端口
方法 | 說明 |
---|---|
send(DatagramPacket p) | 發送一個數據報 |
receive(DatagramPacket p) | 接收一個數據報(阻塞) |
close() | 關閉套接字,釋放端口 |
UDP 是無連接的通信,所以只需要發送和接收數據報,不需要建立連接。
2、DatagramPacket 類
這個類是一個 數據包容器,既可以用于發送數據,也可以用于接收數據。
發送端構造方法:
DatagramPacket packet = new DatagramPacket(byte[] buf, int length, InetAddress address, int port);
參數 | 說明 |
---|---|
buf | 要發送的數據字節數組 |
length | 字節數組長度 |
address | 目標主機地址(InetAddress.getByName(“127.0.0.1”)) |
port | 目標端口號 |
接收端構造方法:
DatagramPacket packet = new DatagramPacket(byte[] buf, int length);
參數 | 說明 |
---|---|
buf | 用來接收數據的字節數組 |
length | 緩沖區大小 |
常用方法:
方法 | 說明 |
---|---|
getData() | 獲取數據字節數組(包含整個緩沖區) |
getLength() | 獲取實際接收到的數據長度 |
getSocketAddress() | 獲取發送方的地址和端口 |
getAddress() / getPort() | 獲取 IP 地址 / 端口號 |
3、UDP客戶端與UDP服務器通信例子
下面是簡單清晰的 UDP 客戶端與服務器通信例子:
UdpEchoServer.java(服務器)
package thread;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpEchoServer {public static void main(String[] args) throws IOException {// 創建 DatagramSocket,綁定端口 9090DatagramSocket socket = new DatagramSocket(9090);System.out.println("服務器已啟動,監聽端口 9090...");while (true) {// 接收客戶端發來的數據包byte[] buffer = new byte[1024]; // 緩沖區DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket); // 阻塞接收// 讀取數據內容String message = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("收到客戶端消息:" + message);// 構造響應內容(原樣返回加上后綴)String response = "回顯:" + message;byte[] responseData = response.getBytes();// 構造響應數據包,目標為收到的客戶端地址和端口DatagramPacket responsePacket = new DatagramPacket(responseData,responseData.length,receivePacket.getAddress(),receivePacket.getPort());// 發送響應數據包socket.send(responsePacket);}}
}
UdpEchoClient.java(客戶端)
package thread;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {public static void main(String[] args) throws IOException {// 創建 DatagramSocket,系統自動分配端口DatagramSocket socket = new DatagramSocket();// 服務器地址和端口InetAddress serverAddress = InetAddress.getByName("127.0.0.1");int serverPort = 9090;Scanner scanner = new Scanner(System.in);System.out.println("請輸入內容,輸入 exit 退出:");while (true) {System.out.print(">> ");String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {break;}// 構造發送數據包byte[] data = input.getBytes();DatagramPacket sendPacket = new DatagramPacket(data, data.length, serverAddress, serverPort);socket.send(sendPacket);// 接收服務器響應byte[] buffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket);// 打印響應String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("來自服務器:" + response);}socket.close();}
}
2、Java TCP 通信核心接口介紹
Java 中使用 TCP 協議 通信的主要類有:
Socket:表示客戶端或服務端通信時的“套接字”
ServerSocket:服務端專用,用于監聽客戶端連接請求
1、ServerSocket 類
ServerSocket 是服務端用來監聽某個端口的類,接收到連接請求后會生成 Socket 進行數據通信。
構造方法:
ServerSocket serverSocket = new ServerSocket(port); // 監聽指定端口
常用方法:
方法 | 說明 |
---|---|
accept() | 接收客戶端連接,返回一個 Socket ,阻塞方法 |
close() | 關閉監聽,釋放端口資源 |
說明: accept() 是阻塞的,直到有客戶端連接才會繼續執行。
2、Socket 類
Socket 表示客戶端套接字,也用于服務端與某個客戶端通信的 Socket 實例。
構造方法(客戶端使用)
ServerSocket serverSocket = new ServerSocket(port); // 監聽指定端口
常用方法:
方法 | 說明 |
---|---|
getInputStream() | 獲取輸入流,用于讀取數據(來自對方) |
getOutputStream() | 獲取輸出流,用于發送數據(給對方) |
close() | 關閉連接 |
3、輸入輸出流常見包裝類
包裝類組合 | 用途 |
---|---|
InputStreamReader + BufferedReader | 讀取字符串(按行讀取) |
OutputStream + PrintWriter | 發送字符串(可自動 flush) |
4、TCP 客戶端與 TCP 服務器通信例子
TCP 服務器(TcpEchoServer.java)
package thread;import java.io.*;
import java.net.*;public class TcpEchoServer {public static void main(String[] args) throws IOException {// 1. 創建 ServerSocket,監聽端口 9090ServerSocket serverSocket = new ServerSocket(9090);System.out.println("TCP服務器啟動,監聽端口 9090...");// 2. 等待客戶端連接(阻塞)Socket clientSocket = serverSocket.accept();System.out.println("客戶端已連接:" + clientSocket.getRemoteSocketAddress());// 3. 獲取輸入輸出流BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true); // 自動刷新// 4. 循環讀取客戶端消息并回顯String message;while ((message = reader.readLine()) != null) {System.out.println("客戶端說:" + message);writer.println("回顯:" + message);}// 5. 關閉連接reader.close();writer.close();clientSocket.close();serverSocket.close();}
}
TCP 客戶端(TcpEchoClient.java)
package thread;import java.io.*;
import java.net.*;
import java.util.Scanner;public class TcpEchoClient {public static void main(String[] args) throws IOException {// 1. 創建 Socket,連接到服務器Socket socket = new Socket("127.0.0.1", 9090);System.out.println("已連接到服務器!");// 2. 獲取輸入輸出流BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); // 自動刷新Scanner scanner = new Scanner(System.in);System.out.println("請輸入要發送的內容,輸入 exit 退出:");// 3. 發送和接收消息while (true) {System.out.print(">> ");String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {break;}writer.println(input); // 發送數據String response = reader.readLine(); // 接收響應System.out.println("服務器回復:" + response);}// 4. 關閉連接socket.close();}
}