Socket 是網路程式設計的基石。本文透過一組極簡的 Echo Server (伺服端) 與 Echo Client (客戶端) 範例,示範 Java 如何使用 ServerSocket、Socket、BufferedReader、PrintWriter 實現雙向文字通訊。程式碼結構清晰,適合初學者掌握「連線建立 → 串流包裝 → 讀寫迴路 → 資源釋放」的完整流程。
new ServerSocket(3434)Socket client = serverSocket.accept()BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()), true); // autoFlush
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String serverMsg;
boolean done = false;
System.out.println("Server ready. Type 'bye' to exit.");
System.out.print("Server: ");
serverMsg = console.readLine(); // 先讀主控台輸入
while (!done) {
if (serverMsg != null) {
out.println(serverMsg); // 發送給客戶端
}
String clientMsg = in.readLine(); // 阻塞等待客戶端回應
if (clientMsg != null) {
System.out.println("Client: " + clientMsg);
}
System.out.print("Server: ");
serverMsg = console.readLine();
if ("bye".equals(serverMsg)) done = true;
}
new Socket("192.168.0.8", 3434) (需修改為實際 Server IP)in.readLine() 接收,再 console.readLine() 發送。| 階段 | Server | Client |
|---|---|---|
| 連線動作 | accept() 被動等待 | new Socket(ip, port) 主動發起 |
| 首發訊息 | 由主控台輸入決定 | 先接收 Server 歡迎訊息 |
| 迴圈順序 | 寫入 → 讀取 | 讀取 → 寫入 |
StandardCharsets.UTF_8)。readLine() 依賴 \n、\r 或 \r\n,發送端務必以 println() 或手動加 \n。PrintWriter 建構子傳入 true 啟用自動刷新,或手動呼叫 flush()。finally 區塊依序關閉串流與 Socket,避免資源洩漏。IOException、ConnectException 等,給予明確錯誤提示。accept() 返回的 Socket 交給獨立 Thread 或執行緒池處理,支援多客戶端同時連線。DataInputStream/DataOutputStream 傳輸二進位結構化資料 (如 int、long、byte[])。Selector、ServerSocketChannel 實現單執行緒高併發。這組範例雖簡單,卻涵蓋了 Java Socket 程式設計最核心的 API 與協作模式。建議動手執行:先啟動 Server,再啟動 Client (修正 IP),在兩個主控台互輸文字觀察流向。理解同步阻塞模型的「誰先說話、誰在等待」是進階網路程式設計的基石。