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

Java Socket 程式設計完整入門:客戶端/伺服端實作與通訊流程解析

     編輯:Java 相關知識

Java 網路程式設計兩大支柱

  • URL 類別: 存取 Internet 資源(HTTP、FTP 等)
  • Socket 類別: Client/Server 模式、自訂協議,基於 TCP/IP 傳輸層介面

Socket 為雙向位元組串流端點,擁有 IP 位址與埠號。通訊雙方需自行約定資料格式化與解析規則,雖較繁瑣但靈活度最高、應用範圍最廣。

Client/Server 工作模式圖解

Socket 通訊模式圖

核心流程:Server 監聽埠口 → Client 發起連線 → 雙向串流資料交換 → 關閉連線。

Java 核心類別

  • java.net.Socket:客戶端通訊端點
  • java.net.ServerSocket:伺服端監聽端點

客戶端程式設計四步驟

  1. 呼叫 new Socket(host, port) 建立連線(含三向交握)
  2. 取得串流:getInputStream() / getOutputStream()
  3. 依協議讀寫位元組串流,完成業務邏輯
  4. 關閉串流與 Socket

客戶端完整範例

import java.io.*;
import java.net.*;

public class SocketCommunicationClient {
    public static void main(String[] args) {
        try {
            Socket clientSocket = new Socket("mice", 9000);
            OutputStream output = clientSocket.getOutputStream();
            DataInputStream input = new DataInputStream(clientSocket.getInputStream());

            int c;
            String response;
            while ((c = System.in.read()) != -1) {
                output.write((byte) c);
                if (c == '\n') { // 換行觸發發送
                    output.flush();
                    response = input.readLine(); // 阻塞等待回應
                    System.out.println("Communication: " + response);
                }
            }
            output.close(); input.close(); clientSocket.close();
        } catch (Exception e) {
            System.err.println("Exception: " + e);
        }
    }
}

程式從標準輸入讀取字元,累積至換行後發送至伺服器,阻塞等待回應並列印,循環至輸入結束。

伺服端程式設計六步驟

  1. new ServerSocket(port) 建立監聽 Socket
  2. accept() 阻塞等待客戶連線,回傳新 Socket 實例
  3. 建立輸入/輸出串流
  4. 依協議處理請求、回傳結果
  5. 關閉客戶端串流與 Socket
  6. 關閉 ServerSocket 結束服務

採用多執行緒可實現並發伺服器,持續監聽新連線。

伺服端完整範例

import java.net.*;
import java.io.*;

public class SocketCommunicationServer {
    public static void main(String[] args) {
        try {
            boolean flag = true;
            ServerSocket serverSocket = new ServerSocket(9000);
            System.out.println("伺服器在埠 9000 監聽中...");

            while (flag) {
                Socket client = serverSocket.accept(); // 阻塞等待連線
                DataInputStream input = new DataInputStream(
                    new BufferedInputStream(client.getInputStream()));
                PrintStream output = new PrintStream(
                    new BufferedOutputStream(client.getOutputStream()));

                String inputLine;
                while ((inputLine = input.readLine()) != null) {
                    if (inputLine.equals("Stop")) { flag = false; break; }
                    output.println(inputLine); // 回應客戶端
                    output.flush();
                }
                output.close(); input.close(); client.close();
            }
            serverSocket.close();
        } catch (IOException e) { /* 處理異常 */ }
    }
}

伺服器接收訊息並原樣回應,收到 "Stop" 關閉服務。實務上可擴充為執行緒池處理高併發。

關鍵重點總結

  • Socket 程式設計本質是位元組串流操作,應用層協議自行定義
  • 串流關閉順序:先關串流,再關 Socket
  • 伺服端 accept() 回傳的新 Socket 專屬於該連線,主 ServerSocket 繼續監聽
  • 生產環境建議:連線池、非阻塞 I/O (NIO)、心跳檢測、優雅關閉
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved