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

Java 網路程式設計核心全景:InetAddress、URL/URLConnection、Socket、Datagram 深度解析

     編輯:Java 相關知識

Java 網路功能三大支柱

java.net 套件提供的網路能力可分為三層抽象:

  1. URL/URLConnection:最高層,面向資源定位與存取,支援 HTTP、FTP、JAR 等協議,適合 REST API 呼叫、檔案下載。
  2. Socket (TCP):傳統網路程式主流,提供可靠、有序、雙向位元組流,適用於客戶/伺服器長連線、即時通訊、資料庫驅動。
  3. Datagram (UDP):最底層,無連線、不可靠、訊息導向,適合廣播、多播、即時影音、DNS 查詢、遊戲狀態同步。

InetAddress:IP 位址封裝與解析

核心靜態工廠方法


// 取得本機 InetAddress
InetAddress local = InetAddress.getLocalHost();

// 由主機名/域名解析(單個)
InetAddress byName = InetAddress.getByName("www.example.com");

// 由主機名解析所有位址(負載均衡、CDN 多 IP)
InetAddress[] all = InetAddress.getAllByName("www.google.com");

實用實例方法

  • getHostName():取得主機名(反向 DNS 解析)。
  • getAddress():取得位元組陣列形式 IP(IPv4 4 位元組,IPv6 16 位元組)。
  • isLoopbackAddress()、isLinkLocalAddress()、isSiteLocalAddress():位址類型判斷。

IP 版本與類別判斷範例


InetAddress addr = InetAddress.getLocalHost();
byte[] ipBytes = addr.getAddress();
if (ipBytes.length == 4) {
    System.out.println("IPv4");
    int first = ipBytes[0] & 0xFF; // 無符號轉換
    if ((first & 0x80) == 0) System.out.println("Class A");
    else if ((first & 0xC0) == 0x80) System.out.println("Class B");
    else if ((first & 0xE0) == 0xC0) System.out.println("Class C");
    else if ((first & 0xF0) == 0xE0) System.out.println("Class D (Multicast)");
    else System.out.println("Class E (Reserved)");
} else if (ipBytes.length == 16) {
    System.out.println("IPv6");
}

URL 與 URLConnection:資源導向網路存取

URL 核心構成


URL url = new URL("https://user:pass@api.example.com:8443/v1/users?id=123#profile");
// 協議://用戶:密碼@主機:埠/路徑?查詢參數#錨點

URLConnection 關鍵操作


HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.setConnectTimeout(5000);
conn.setReadTimeout(10000);

try (OutputStream os = conn.getOutputStream()) {
    os.write(jsonBytes);
}

int status = conn.getResponseCode();
try (InputStream is = status < 400 ? conn.getInputStream() : conn.getErrorStream()) {
    String response = new String(is.readAllBytes(), StandardCharsets.UTF_8);
}

TCP Socket:可靠雙向位元組流

客戶端 Socket 基本流程


try (Socket socket = new Socket("host", 8080);
     OutputStream out = socket.getOutputStream();
     InputStream in = socket.getInputStream()) {
    
    out.write(requestBytes);
    out.flush();
    
    byte[] buffer = new byte[4096];
    int len = in.read(buffer);
    // 處理回應...
}

伺服端 ServerSocket 基本流程


try (ServerSocket server = new ServerSocket(8080)) {
    while (true) {
        Socket client = server.accept(); // 阻塞等待
        // 建議提交線程池處理,或使用 NIO
        executor.submit(() -> handleClient(client));
    }
}

Socket 進階選項

選項方法用途
SO_TIMEOUTsetSoTimeout(ms)讀取超時,防止永久阻塞
SO_KEEPALIVEsetKeepAlive(true)TCP 心跳,檢測死連線
TCP_NODELAYsetTcpNoDelay(true)關閉 Nagle 演算法,降低延遲
SO_RCVBUF/SO_SNDBUFsetReceiveBufferSize/setSendBufferSize調整系統接收/發送緩衝區
SO_LINGERsetSoLinger(true, seconds)關閉時延遲發送未傳完資料

DatagramSocket:UDP 無連線傳輸


// 發送端
try (DatagramSocket socket = new DatagramSocket()) {
    byte[] data = "Hello UDP".getBytes();
    InetAddress target = InetAddress.getByName("255.255.255.255"); // 廣播
    DatagramPacket packet = new DatagramPacket(data, data.length, target, 9999);
    socket.send(packet);
}

// 接收端
try (DatagramSocket socket = new DatagramSocket(9999)) {
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    socket.receive(packet); // 阻塞
    String msg = new String(packet.getData(), 0, packet.getLength());
    InetAddress sender = packet.getAddress();
}

總結與選型指南

場景推薦 API理由
呼叫 REST API、下載檔案HttpClient (Java 11+) / OkHttp高層封裝、連線池、自動重試、支援 HTTP/2
自定義 TCP 協議、長連線即時推送Netty / NIO SocketChannel高效能、事件驅動、編解碼框架
簡單 TCP 客戶端/伺服器教學/原型Socket / ServerSocketAPI 直觀、阻塞模型易理解
廣播發現、DNS、即時遊戲狀態、IoT 傳感器上報DatagramSocket / NIO DatagramChannel無連線、低延遲、支援多播

掌握 Java 網路三大支柱的特性與適用邊界,是構建健壯分散式系統的基石。

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