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

Java SE 網絡編程實戰:TCP Socket 雙向通訊完整範例

     編輯:Java 綜合教學

Java SE 網絡編程實戰:TCP Socket 雙向通訊完整範例

本文通過完整代碼示範 Java 基於 Socket / ServerSocket 實現客戶端與服務端的雙向文本通訊,涵蓋流處理、緩衝、編碼轉換關鍵技術點。

核心類別職責

類別套件用途
ServerSocketjava.net服務端監聽指定埠,accept() 阻塞等待客戶端連接
Socketjava.net雙端通訊端點,提供 InputStream/OutputStream
BufferedReader/Writerjava.io字符流緩衝,支援 readLine() 按行讀取
InputStreamReader/OutputStreamWriterjava.io位元組流↔字符流轉換橋樑,指定編碼 (UTF-8)
PrintWriterjava.io便利列印方法,println() 自動換行並 flush

服務端實現 (Server1.java)

public class Server1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        try (ServerSocket server = new ServerSocket(9880)) {
            while (true) {
                Socket client = server.accept();
                System.out.println("客戶端連接:" + client.getInetAddress().getHostAddress());
                
                // 發送訊息給客戶端
                OutputStream os = client.getOutputStream();
                PrintWriter pw = new PrintWriter(
                    new BufferedWriter(new OutputStreamWriter(os, "UTF-8")), true);
                
                System.out.print("我說:");
                String serverMsg = input.nextLine();
                pw.println(serverMsg);  // auto flush
                
                // 接收客戶端訊息
                InputStream is = client.getInputStream();
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is, "UTF-8"));
                String msg = reader.readLine();
                System.out.println("客戶端說:" + msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客戶端實現 (Client1.java)

public class Client1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        try (Socket client = new Socket("127.0.0.1", 9880)) {
            // 接收服務端訊息
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(client.getInputStream(), "UTF-8"));
            String msg = reader.readLine();
            System.out.println("服務端說:" + msg);
            
            // 發送訊息給服務端
            PrintWriter pw = new PrintWriter(
                new BufferedWriter(
                    new OutputStreamWriter(client.getOutputStream(), "UTF-8")), true);
            
            System.out.print("我說:");
            String clientMsg = input.nextLine();
            pw.println(clientMsg);  // auto flush
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

關鍵技術細節解析

  1. 流鏈組裝順序: 位元組流 → 轉換流 → 緩衝流 → 列印流,層層包裝賦能。
  2. 編碼一致性: 雙端必須指定相同字符集 (UTF-8),否則中文亂碼。
  3. 行協議: 使用 readLine() / println() 以換行符作為訊息邊界,簡化應用層協議設計。
  4. 自動 Flush: PrintWriter 建構子第二參數 true 開啟自動刷新,確保訊息即時發送。
  5. 資源管理: 使用 try-with-resources (JDK 7+) 自動關閉 Socket 與流,避免洩漏。

運行效果展示

服務端輸出 客戶端輸出 雙向通訊演示

進階擴展方向

  • 多線程處理併發連接 (ExecutorService + 執行緒池)
  • 非阻塞 I/O (NIO) / Asynchronous I/O (AIO) 提升擴展性
  • 自定義協議框架 (長度前綴、序列化、心跳檢測)
  • SSL/TLS 加密傳輸 (SSLSocketFactory)

完整代碼獲取

本文代碼已包含完整包結構與導入語句,可直接複製至 IDE 運行。建議先啟動 Server,再啟動 Client 進行測試。

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