java.net.Socket 是 Java 網路程式設計的核心類別,代表客戶端與伺服器之間的雙向通訊端點。本文詳細說明 Socket 建構子、常用方法、輸入輸出流處理,並提供完整的客戶端程式範例與執行結果。
| 建構子 | 說明 |
|---|---|
Socket(InetAddress addr, int port) | 指定 InetAddress 物件與連接埠建立連線。 |
Socket(String host, int port) | 指定主機名稱/IP 與連接埠建立連線。若主機名解析失敗拋 UnknownHostException。 |
兩者皆建立基於 TCP 的流式 Socket。成功連線後,本地端會綁定任意可用連接埠;失敗拋 IOException。
getInputStream():取得輸入串流讀取伺服器資料。getOutputStream():取得輸出串流發送資料給伺服器。close():關閉 Socket 及相關串流。getLocalAddress() / getLocalPort():本地端 IP/埠。getInetAddress() / getPort():遠端伺服器 IP/埠。Socket s = new Socket("198.163.227.6", 13);
InputStream is = s.getInputStream();
// 讀取資料...
is.close();
s.close();
import java.io.*;
import java.net.*;
class SSClient {
public static void main(String[] args) {
String host = "localhost";
if (args.length == 1) host = args[0];
BufferedReader br = null;
PrintWriter pw = null;
Socket s = null;
try {
s = new Socket(host, 10000); // 連接伺服器埠 10000
// 建立字元導向的 BufferedReader
InputStreamReader isr = new InputStreamReader(s.getInputStream());
br = new BufferedReader(isr);
// 建立自動刷新的 PrintWriter
pw = new PrintWriter(s.getOutputStream(), true);
// 發送指令並接收回應
pw.println("DATE");
System.out.println(br.readLine()); // 印出目前日期時間
pw.println("PAUSE"); // 測試多執行緒
pw.println("DOW");
System.out.println(br.readLine()); // 印出星期
pw.println("DOM");
System.out.println(br.readLine()); // 印出日期
pw.println("DOY");
System.out.println(br.readLine()); // 印出年間第幾天
} catch (IOException e) {
System.out.println(e.toString());
} finally {
// 依序關閉資源
try { if (br != null) br.close(); } catch (IOException ignored) {}
try { if (pw != null) pw.close(); } catch (IOException ignored) {}
try { if (s != null) s.close(); } catch (IOException ignored) {}
}
}
}
Tue Jan 29 18:11:51 CST 2002
TUESDAY
29
29
javac SSClient.javajava SSClient [hostname](預設 localhost,可指定如 www.example.com)。try-with-resources (Java 7+) 自動關閉 Socket、Reader、Writer。s.connect(new InetSocketAddress(host, port), timeoutMs) 避免無限阻塞。Socket 是 Java 網路通訊的基石。掌握其建構、串流鏈接、資源釋放與異常處理,即可開發穩健的客戶端應用。進階主題包含非阻塞 I/O (NIO)、SSL/TLS 安全通訊、連線池管理等。