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

Java Socket 入門:TCP 客戶端/伺服器通訊完整範例

     編輯:Java 相關知識

Socket 通訊基礎概念

Socket(套接字)是網路通訊的基礎抽象,代表兩台機器間連線的「端點」。Java 在 java.net 套件提供 Socket(客戶端)與 ServerSocket(伺服器端)類別,封裝了 TCP 協定的複雜細節,讓開發者專注於業務邏輯而非底層網路操作。

伺服器端實作 (tcpserver.java)

public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8000);
        System.out.println("Server started on port 8000...");
        
        Socket clientSocket = serverSocket.accept(); // 阻塞等待客戶連線
        System.out.println("Client connected: " + clientSocket.getInetAddress());
        
        DataInputStream in = new DataInputStream(clientSocket.getInputStream());
        PrintStream out = new PrintStream(clientSocket.getOutputStream());
        
        out.println("Welcome to Java Socket Server!");
        
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            if ("quit".equalsIgnoreCase(inputLine)) break;
            System.out.println("Client said: " + inputLine);
            out.println("Echo: " + inputLine); // 回應客戶
        }
        
        // 資源釋放
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客戶端實作 (tcpclient.java)

public class TcpClient {
    public static void main(String[] args) throws IOException {
        if (args.length < 1) {
            System.out.println("Usage: java TcpClient ");
            return;
        }
        
        Socket socket = new Socket(args[0], 8000);
        System.out.println("Connected to server");
        
        DataInputStream in = new DataInputStream(socket.getInputStream());
        PrintStream out = new PrintStream(socket.getOutputStream());
        BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
        
        // 讀取伺服器歡迎訊息
        System.out.println("Server: " + in.readLine());
        
        String userInput;
        while ((userInput = keyboard.readLine()) != null) {
            out.println(userInput); // 發送給伺服器
            if ("quit".equalsIgnoreCase(userInput)) break;
            System.out.println("Server echo: " + in.readLine()); // 讀取回應
        }
        
        // 資源釋放
        keyboard.close();
        in.close();
        out.close();
        socket.close();
    }
}

執行步驟與驗證

  1. 先編譯:javac TcpServer.java TcpClient.java
  2. 啟動伺服器:java TcpServer
  3. 另開終端機啟動客戶端:java TcpClient 127.0.0.1
  4. 在客戶端輸入文字,觀察雙向通訊
  5. 輸入 quit 結束連線

進階擴充方向

  • 多線程伺服器:將 accept() 後的處理邏輯移至獨立執行緒,支援多客戶端並發
  • 訊息協定:定義訊息格式(如 JSON、Protocol Buffers)替代純文字行
  • 心跳機制:定期發送 Ping/Pong 偵測連線存活狀態
  • SSL/TLS 加密:使用 SSLSocket/SSLServerSocket 保障傳輸安全
  • NIO 非阻塞:升級至 java.nio.channels 實作高併發伺服器

常見問題排查

連線被拒絕:確認伺服器已啟動、埠號正確、防火牆允許通訊。
中文亂碼:統一指定編碼 new InputStreamReader(is, "UTF-8")。
資料傳輸不完整:TCP 為串流協定,需自行定義訊息邊界(長度前綴、分隔符、固定長度)。

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