首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 網絡編程核心總結:InetAddress、URL、UDP/TCP Socket 實戰模式

     編輯:Java 綜合教學

Java 網絡編程核心總結:InetAddress、URL、UDP/TCP Socket 實戰模式

Java java.net 包提供了網絡編程基石。本文系統梳理 InetAddress、URL、UDP (DatagramSocket)、TCP (ServerSocket/Socket) 四大核心類的關鍵 API、典型使用模式與代碼範本,作為快速查閱手冊。

一、InetAddress:IP 地址與域名解析封裝

  • 無公構造器,靜態工廠方法獲取實例。
  • 不包含端口信息,純 IP/DNS 封裝。
// 核心方法
InetAddress.getByName("www.baidu.com")      // 域名解析
InetAddress.getLocalHost()                   // 本機地址
inetAddress.getHostAddress()                 // IP 字符串 "127.0.0.1"
inetAddress.getHostName()                    // 主機名 "localhost"
inetAddress.getAddress()                     // byte[] 原始 IP (4/16 字節)

典型場景

  • 服務註冊發現:獲取本機 IP 向註冊中心上報。
  • IP 白名單校驗:request.getRemoteAddr() 對比 InetAddress 解析結果。

二、URL:統一資源定位符解析

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

典型場景

  • HTTP 客戶端構建請求 URL,動態拼接查詢參數。
  • 資源下載器:解析 getFile() 獲取文件名存儲。

三、UDP 編程:DatagramSocket + DatagramPacket

特點:無連接、不可靠、有邊界、效率高、適合廣播/流媒體/心跳。

客戶端發送流程

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 同時承載「數據+目標地址」(發送) 或「數據+發送者地址」(接收)。
  • 緩衝區大小建議 ≥ MTU (1500) 避免截斷,最大 64KB。
  • 廣播發送:socket.setBroadcast(true) + 目標 255.255.255.255。

四、TCP 編程:ServerSocket + Socket

特點:面向連接、可靠有序、流式無邊界、需處理粘包/拆包。

服務端模式 (阻塞 IO)

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 但仍可寫入。
  • 高併發建議升級 NIO (Netty/Mina) 或 AIO,避免線程模型瓶頸。

五、協議選型決策表

場景推薦協議理由
即時通訊/遊戲狀態同步UDP低延遲、容忍丟包、高頻小包
文件傳輸/HTTP API/數據庫連接TCP可靠有序、流控、成熟生態
服務發現/心跳/日誌收集UDP 廣播/組播一對多、無連接開銷
金融交易/訂單系統TCP + 應用層確認強一致性、不可丟失

六、避坑清單

  1. 字符編碼顯式指定:StandardCharsets.UTF_8,避免平台默認編碼差異。
  2. 資源釋放用 try-with-resources:Socket/Stream/Channel 必須關閉,防止文件描述符洩漏。
  3. 設置超時:socket.setSoTimeout(5000) 防止讀寫無限阻塞。
  4. UDP 發送大包分片:超過 MTU 會 IP 分片,丟一片全丟,應用層自行分片重組。
  5. TCP 粘包處理:長度前綴 (4 字節) + 內容,或換行符分隔 (文本協議)。

掌握這四大核心類與兩種傳輸協議的編程模式,是構建高性能網絡應用、排查連接異常、理解 RPC 框架底層原理的必備基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved