Java java.net 包提供了網絡編程基石。本文系統梳理 InetAddress、URL、UDP (DatagramSocket)、TCP (ServerSocket/Socket) 四大核心類的關鍵 API、典型使用模式與代碼範本,作為快速查閱手冊。
// 核心方法
InetAddress.getByName("www.baidu.com") // 域名解析
InetAddress.getLocalHost() // 本機地址
inetAddress.getHostAddress() // IP 字符串 "127.0.0.1"
inetAddress.getHostName() // 主機名 "localhost"
inetAddress.getAddress() // byte[] 原始 IP (4/16 字節)
request.getRemoteAddr() 對比 InetAddress 解析結果。URL url = new URL("https://user:pass@host:8080/path/file.html?query=1#anchor");
// 核心獲取器
url.getProtocol() // "http"
url.getHost() // "host"
url.getPort() // 8080 (-1 表示默認端口)
url.getFile() // "/path/file.html?query=1"
url.getPath() // "/path/file.html"
url.getQuery() // "query=1"
url.getRef() // "anchor"
url.getUserInfo() // "user:pass"
// 相對路徑解析
URL base = new URL("https://host/a/");
URL resolved = new URL(base, "b.txt"); // https://host/a/b.txt
getFile() 獲取文件名存儲。特點:無連接、不可靠、有邊界、效率高、適合廣播/流媒體/心跳。
DatagramSocket socket = new DatagramSocket(6666); // 綁定本地端口
byte[] data = "消息內容".getBytes(StandardCharsets.UTF_8);
InetSocketAddress serverAddr = new InetSocketAddress("localhost", 8888);
DatagramPacket packet = new DatagramPacket(data, data.length, serverAddr);
socket.send(packet);
socket.close();
DatagramSocket socket = new DatagramSocket(8888); // 綁定服務端口 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); // 阻塞等待 String msg = new String(packet.getData(), 0, packet.getLength(), StandardCharsets.UTF_8); socket.close();
DatagramPacket 同時承載「數據+目標地址」(發送) 或「數據+發送者地址」(接收)。socket.setBroadcast(true) + 目標 255.255.255.255。特點:面向連接、可靠有序、流式無邊界、需處理粘包/拆包。
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket client = server.accept(); // 阻塞等待連接
new Thread(() -> handle(client)).start(); // 每連接一線程
}
void handle(Socket socket) {
try (InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream()) {
// 讀取請求、寫入響應
} catch (IOException e) { /* 處理 */ }
}
Socket socket = new Socket("localhost", 8888);
try (OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream()) {
out.write(requestBytes);
out.flush();
// 讀取響應
}
socket.shutdownOutput() 發送 FIN,對端讀到 -1 但仍可寫入。| 場景 | 推薦協議 | 理由 |
|---|---|---|
| 即時通訊/遊戲狀態同步 | UDP | 低延遲、容忍丟包、高頻小包 |
| 文件傳輸/HTTP API/數據庫連接 | TCP | 可靠有序、流控、成熟生態 |
| 服務發現/心跳/日誌收集 | UDP 廣播/組播 | 一對多、無連接開銷 |
| 金融交易/訂單系統 | TCP + 應用層確認 | 強一致性、不可丟失 |
StandardCharsets.UTF_8,避免平台默認編碼差異。socket.setSoTimeout(5000) 防止讀寫無限阻塞。掌握這四大核心類與兩種傳輸協議的編程模式,是構建高性能網絡應用、排查連接異常、理解 RPC 框架底層原理的必備基本功。