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

Java Socket 通訊入門:從簡單 Echo Server/Client 理解雙向傳輸

     編輯:Java 相關知識

前言

Socket 是網路程式設計的基石。本文透過一組極簡的 Echo Server (伺服端) 與 Echo Client (客戶端) 範例,示範 Java 如何使用 ServerSocket、Socket、BufferedReader、PrintWriter 實現雙向文字通訊。程式碼結構清晰,適合初學者掌握「連線建立 → 串流包裝 → 讀寫迴路 → 資源釋放」的完整流程。

伺服端實作 (SocketTest_Server)

核心流程

  1. 建立 ServerSocket 監聽埠口 3434:new ServerSocket(3434)
  2. 阻塞等待客戶端連線:Socket client = serverSocket.accept()
  3. 包裝輸入/輸出串流:
    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));
  4. 雙向通訊迴圈:伺服端先從主控台讀取一行發送給客戶端,再讀取客戶端回應並印出,直到輸入 "bye" 結束。

關鍵程式碼片段

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;
}

客戶端實作 (SocketTest_SvrClit)

核心流程

  1. 主動連線至伺服器:new Socket("192.168.0.8", 3434) (需修改為實際 Server IP)
  2. 同樣包裝串流,但先讀取伺服器訊息,再從主控台輸入回覆。
  3. 迴圈邏輯相反:先 in.readLine() 接收,再 console.readLine() 發送。

關鍵差異對照表

階段ServerClient
連線動作accept() 被動等待new Socket(ip, port) 主動發起
首發訊息由主控台輸入決定先接收 Server 歡迎訊息
迴圈順序寫入 → 讀取讀取 → 寫入

常見坑點與最佳實務

  • 編碼一致性:兩端必須使用相同字元集 (範例預設平台編碼,建議明確指定 StandardCharsets.UTF_8)。
  • 行結尾處理:readLine() 依賴 \n、\r 或 \r\n,發送端務必以 println() 或手動加 \n。
  • 緩衝區刷新:PrintWriter 建構子傳入 true 啟用自動刷新,或手動呼叫 flush()。
  • 資源關閉順序:在 finally 區塊依序關閉串流與 Socket,避免資源洩漏。
  • 異常處理:捕捉 IOException、ConnectException 等,給予明確錯誤提示。

擴充練習建議

  1. 修改為多執行緒伺服器:將每個 accept() 返回的 Socket 交給獨立 Thread 或執行緒池處理,支援多客戶端同時連線。
  2. 改用 DataInputStream/DataOutputStream 傳輸二進位結構化資料 (如 int、long、byte[])。
  3. 加入心跳機制:定時發送 PING 確認連線存活。
  4. 嘗試 NIO (Non-blocking I/O):使用 Selector、ServerSocketChannel 實現單執行緒高併發。
  5. 總結

    這組範例雖簡單,卻涵蓋了 Java Socket 程式設計最核心的 API 與協作模式。建議動手執行:先啟動 Server,再啟動 Client (修正 IP),在兩個主控台互輸文字觀察流向。理解同步阻塞模型的「誰先說話、誰在等待」是進階網路程式設計的基石。

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