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

Java Socket 網路程式設計實戰:雙向通訊與多執行緒聊天伺服器

     編輯:Java 相關知識

Socket 核心概念

Socket 代表網路通訊端點,雙向通訊透過兩個串流實現:

  • getInputStream():接收對端資料(輸入流)
  • getOutputStream():發送資料給對端(輸出流)

伺服器端實作

ServerSocket server = new ServerSocket(9998);
while (true) {
    Socket client = server.accept(); // 阻塞等待連線
    
    // 建立緩衝文字流
    BufferedReader in = new BufferedReader(
        new InputStreamReader(client.getInputStream()));
    PrintWriter out = new PrintWriter(
        client.getOutputStream(), true); // auto-flush
    
    // 處理對話(可移至獨立執行緒)
    String msg;
    while ((msg = in.readLine()) != null) {
        System.out.println("收到: " + msg);
        out.println("Echo: " + msg);
    }
    
    // 關閉順序:先出後入
    out.close();
    in.close();
    client.close();
}

多執行緒聊天伺服器架構

public class ChatServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9998);
        ExecutorService pool = Executors.newCachedThreadPool();
        
        while (true) {
            Socket client = server.accept();
            pool.submit(new ClientHandler(client));
        }
    }
}

class ClientHandler implements Runnable {
    private Socket socket;
    ClientHandler(Socket s) { socket = s; }
    
    public void run() {
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
            
            String msg;
            while ((msg = in.readLine()) != null) {
                broadcast(msg); // 廣播給所有客戶端
            }
        } catch (IOException e) {
            // 連線斷開
        }
    }
}

關鍵最佳實務

  • 緩衝文字流:BufferedReader + PrintWriter 處理行導向協定
  • auto-flush:PrintWriter(..., true) 確保即時發送
  • 執行緒池:避免無限制建立執行緒導致 OOM
  • try-with-resources:保證資源釋放
  • 關閉順序:輸出流 → 輸入流 → Socket

客戶端範例

Socket socket = new Socket("localhost", 9998);
BufferedReader in = new BufferedReader(
    new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

// 發送
out.println("Hello Server");
// 接收
String reply = in.readLine();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved