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

基於 AWT 打造個性化 Java 聊天軟件:從架構到核心源碼解析

     編輯:Java 程式設計入門

項目概覽

本文詳細記錄一款純 AWT 實現的 Java 聊天軟件開發全過程,重點剖析如何利用 AWT 組件構建個性化界面。項目特色在於:零 Swing 依賴、自研 Tab 控件與圖像畫布、完整客戶端/服務端架構、支持表情圖片、私聊、自定義配色及語音邀請等功能。

系統架構與通信協議

自定義 RFC 命令集

命令功能說明
HELO初始化服務器連接
QUIT用戶退出聊天室
KICK踢出用戶/禁止參與
CHRO切換聊天室
MESS發送普通消息
PRIV發送私聊消息
ROCO獲取指定聊天室在線人數
CALL邀請語音聊天(本文未實現)

服務端核心設計

UserObject 封裝客戶端狀態

自定義 UserObject 類,封裝用戶名、Socket 連接、所在聊天室等完整客戶端信息,便於統一管理。

多線程並發模型

服務端監聽 1436 端口,每新增一個客戶連接即啟動獨立 ChatCommunication 線程處理該用戶的所有命令交互:

// ChatServer.java 主循環
while (true) {
    Socket socket = serverSocket.accept();
    ChatCommunication chat = new ChatCommunication(socket);
}

// ChatCommunication 構造器
ChatCommunication(Socket socket) {
    personalSocket = socket;
    dout = new DataOutputStream(personalSocket.getOutputStream());
    // 啟動專門線程監聽客戶端命令...
}

客戶端界面與消息渲染引擎

自研組件:Tab 控件與 ImageCanvas

完全基於 AWT 實現標籤頁切換與富文本消息畫布,支持文本與表情圖片混排。

消息繪製核心邏輯

採用「數組列表存儲消息對象 + 坐標偏移量記錄」策略,重繪時遍歷列表調用 PaintMessageToMessageCanvas():

private void PaintMessageIntoCanvas(MessageObject messageObject) {
    int m_YPos = messageObject.StartY - YOffset;
    int m_XPos = 5 - XOffset;
    int customWidth = 0;
    String message = messageObject.Message;

    // 1. 繪製用戶名(特殊字體)
    if (message.indexOf(":") >= 0) {
        graphics.setFont(userNameFont);
        String userName = message.substring(0, message.indexOf(":") + 1);
        graphics.drawString(userName, m_XPos + customWidth, m_YPos);
        customWidth += fontMetrics.stringWidth(userName) + horizontalSpace;
        message = message.substring(message.indexOf(":") + 1);
    }

    // 2. 繪製正文文本與圖片混排
    graphics.setFont(textFont);
    if (messageObject.IsImage) {
        StringTokenizer tokenizer = new StringTokenizer(message, " ");
        while (tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();
            if (token.indexOf("~~") >= 0) { // 圖片標記格式:~~索引
                try {
                    int imgIndex = Integer.parseInt(token.substring(2));
                    if (imgIndex >= 0 && imgIndex < chatClient.iconCount) {
                        graphics.drawImage(chatClient.iconArray[imgIndex],
                            m_XPos + customWidth, m_YPos - 15,
                            messageObject.Width, messageObject.Height, this);
                        customWidth += messageObject.Width + horizontalSpace;
                    }
                } catch (Exception ignored) {}
            } else { // 普通文本
                graphics.drawString(token, m_XPos + customWidth, m_YPos);
                customWidth += fontMetrics.stringWidth(token) + horizontalSpace;
            }
        }
    }
    // 更新總寬度用於滾動條計算...
}

此設計實現了輕量級的富文本渲染,無需依賴 Swing 的 JEditorPane 或第三方庫。

總結與啟發

純 AWT 開發雖增加了自研組件的工作量,卻帶來極小的運行時體積與極高的可控性,適合資源受限環境或教學演示。完整源碼見文中鏈接。

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