Daytime 服務(RFC 867)運行在 埠 13,回傳當前日期時間字串。Unix 系統通常內建,Windows 需自行實作 Server。
import java.net.*;
import java.io.*;
public class DaytimeClient {
public static final int SERVICE_PORT = 13;
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("用法: java DaytimeClient <主機名>");
return;
}
String hostname = args[0];
try {
// 1. 建立連線
Socket daytime = new Socket(hostname, SERVICE_PORT);
System.out.println("連線已建立");
// 2. 設定超時(防掛死)
daytime.setSoTimeout(2000);
// 3. 讀取回應
BufferedReader reader = new BufferedReader(
new InputStreamReader(daytime.getInputStream())
);
System.out.println("伺服器回應: " + reader.readLine());
// 4. 關閉資源
daytime.close();
} catch (IOException e) {
System.err.println("錯誤: " + e);
}
}
}
new Socket(host, port):主動發起三次交握,阻塞直到連線成功或超時setSoTimeout(ms):讀取阻塞上限,避免服務端不回應導致客戶端永久等待BufferedReader 包裝 InputStreamReader:高效按行讀取文本協議close():釋放檔案描述符,發送 FIN 封包結束連線java DaytimeClient localhost
# 或指定遠端 Unix 主機
java DaytimeClient time.nist.gov
前提:目標主機必須在埠 13 運行 Daytime 服務。
| 特性 | 客戶端 Socket | 伺服端 ServerSocket |
|---|---|---|
| 綁定埠 | 任意臨時埠 | 固定知名埠(如 80, 13, 22) |
| 連線方向 | 主動連接 | 被動監聽 accept() |
| 併發模型 | 單連線 | 多連線並發(每次 accept 產生新 Socket) |
| 生命週期 | 短暫 | 長期運行 |
ServerSocket server = new ServerSocket(PORT);
while (true) {
Socket client = server.accept(); // 阻塞等待連線
// 此處 client 即為已建立連線的 Socket
// 可啟動新執行緒處理:new Thread(() -> handle(client)).start();
}
accept() 返回的 Socket 已完成三次交握,可直接讀寫accept + 執行緒池處理業務,或 NIO 非阻塞模型new ServerSocket(port, backlog, InetAddress.getByName("192.168.1.1")) 限制介面public class DaytimeServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(13);
System.out.println("Daytime Server 啟動,監聽埠 13...");
ExecutorService pool = Executors.newCachedThreadPool();
while (true) {
final Socket client = server.accept();
pool.execute(() -> {
try (PrintWriter out = new PrintWriter(client.getOutputStream(), true)) {
out.println(new java.util.Date().toString());
} catch (IOException ignored) {}
finally { try { client.close(); } catch (IOException ignored) {} }
});
}
}
}
後續將介紹:非阻塞 I/O (NIO)、SSL/TLS 安全通訊、自定義協議設計、連線池與零拷貝傳輸。