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

Java Socket 廣播訊息系統:多執行緒 C/S 架構完整實作

     編輯:Java 相關知識

系統架構概覽

採用經典 Client/Server (C/S) 架構 搭配 多執行緒 實現廣播訊息傳遞:

  • Server:監聽指定 Port,接受多 Client 連線,將收到的訊息廣播給所有連線中 Client
  • Client:連線 Server,雙向收發訊息,提供 GUI 介面
  • Socket:邏輯連線端點,需 IP/Port 建立
  • 執行緒:Server 為每個 Client 建立獨立處理執行緒(ChatHandler),Client 以單一執行緒接收訊息

Server 端核心實作

GUI 初始化

public class ChatServer extends JFrame {
    private TextArea output = new TextArea(15, 40);
    private JMenuBar menuBar = new JMenuBar();

    public ChatServer(String title) {
        // 選單、關於對話框、視窗事件處理...
        output.setEditable(false);
        output.setForeground(Color.BLUE);
        setJMenuBar(menuBar);
        getContentPane().add("North", output);
        getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
    }

    public static void main(String[] args) throws IOException {
        if (args.length != 1) throw new IllegalArgumentException("Syntax: ChatServer ");
        int port = Integer.parseInt(args[0]);

        ChatServer win = new ChatServer("ChitChat Broadcast Messenger: Server");
        // 置中顯示...
        win.setVisible(true);

        ServerSocket server = new ServerSocket(port);
        while (true) {
            Socket client = server.accept(); // 阻塞等待連線
            output.append("\nAccepted from " + client.getInetAddress() + "\n");
            new ChatHandler(client).start(); // 啟動處理執行緒
        }
    }
}

ChatHandler 廣播邏輯(簡化版)

class ChatHandler extends Thread {
    private Socket client;
    private static List writers = Collections.synchronizedList(new ArrayList<>());

    public ChatHandler(Socket socket) { this.client = socket; }

    @Override
    public void run() {
        try (DataInputStream in = new DataInputStream(client.getInputStream());
             DataOutputStream out = new DataOutputStream(client.getOutputStream())) {
            writers.add(out); // 註冊寫入器
            String msg;
            while ((msg = in.readUTF()) != null) {
                broadcast(msg); // 廣播給所有 Client
            }
        } catch (IOException e) { /* 移除 writer、關閉資源 */ }
    }

    private void broadcast(String msg) {
        for (DataOutputStream w : writers) {
            try { w.writeUTF(msg); w.flush(); } catch (IOException ignored) {}
        }
    }
}

Client 端核心實作

介面與連線

public class ChatClient implements Runnable, WindowListener, ActionListener {
    private Socket socket;
    private DataInputStream in;
    private DataOutputStream out;
    private Thread listener;
    private TextArea output;
    private TextField input;
    private SketchFrame window; // 自訂視窗類別

    public ChatClient(String host, int port, SketchFrame window) {
        this.window = window;
        // GUI 初始化:output 置中、input 置底、選單、顏色選擇...
    }

    public synchronized void start() throws IOException {
        socket = new Socket(host, port);
        in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        out.writeUTF(yourName + " has logged on\n");
        listener = new Thread(this);
        listener.start();
        window.setVisible(true);
    }

    @Override
    public void run() { // 接收訊息迴圈
        try {
            while (!Thread.interrupted()) {
                String line = in.readUTF();
                output.append(line + "\n");
            }
        } catch (IOException e) { handleIOException(e); }
    }

    public void actionPerformed(ActionEvent e) { // 發送訊息
        String msg = input.getText();
        if (msg.length() > 0) {
            try { out.writeUTF(msg); out.flush(); input.setText(""); }
            catch (IOException ex) { handleIOException(ex); }
        }
    }

    public synchronized void stop() throws IOException {
        if (listener != null) {
            listener.interrupt();
            listener = null;
            out.close();
        }
    }
}

關鍵技術細節

編譯與執行步驟

  1. 編譯:javac ChatServer.java ChatClient.java ChatHandler.java SketchFrame.java
  2. 啟動 Server:java ChatServer 8888
  3. 啟動多個 Client:java ChatClient localhost 8888
  4. 在 Client 視窗輸入訊息按 Enter,即可看到廣播效果

擴充建議

  • 加入使用者列表、私訊功能
  • 引入 NIO (Selector) 提升併發處理能力
  • 實作心跳機制偵測斷線
  • 加入 SSL/TLS 加密傳輸
  • 使用資料庫持久化聊天記錄
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技術點說明
阻塞式 I/OreadUTF()、accept() 預設阻塞,適合簡單應用
執行緒安全共享 writers 列表使用 Collections.synchronizedList
資源釋放stop() 中關閉串流、中斷執行緒、移除 writer
GUI 更新Client 接收訊息直接在接收執行緒更新 TextArea(教學用途可接受,生產環境建議 SwingUtilities.invokeLater)