首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

典型網路資料庫系統設計:DAO + CSocket 實作聊天室與廣播功能

     編輯:關於VC++

一、系統概覽

  • 內部系統,帳號由管理員維護,分 User 組 與 Boss 組(可發廣播)。
  • 任意兩用戶可互通訊息。
  • 資料庫介面:DAO;網路通訊:CSocket + CSocketFile。

二、資料庫設計

User (No, Name, Password, G#)      -- 候選鍵 No,外鍵 G#
Group (G#, GroupName, Demo)        -- 主鍵 G#

ER 圖見原文圖片。

三、訊息協定設計

3.1 訊息類型枚舉

enum MSGTYPE { LOGIN, LOGINResponse, CHATTING, USERList, NOTICE };

3.2 訊息類別 (可序列化)

class CMsg : public CObject {
public:
    int m_eType;          // 訊息類型
    CString m_strMsg;     // 內容,格式隨類型而異
    CMsg(); virtual ~CMsg();
    virtual void Serialize(CArchive& ar);
};

3.3 m_strMsg 格式規範

m_eTypem_strMsg 內容 (以 | 分隔)
LOGIN暱稱|密碼
LOGINResponseGOOD|歡迎!(BOSS) 或 FAILED|驗證失敗!
CHATTING接收用戶|訊息內容
USERList暱稱1|暱稱2|...|暱稱n|END
NOTICEALL|內容 或 發送者|內容

3.4 解碼函式

CString Decode(int n, CString strMsg) {
    int pos; CString str;
    for (int i=1; i<=n; i++) {
        pos = strMsg.Find('|', 0);
        if (pos < 0) str = strMsg;
        else str = strMsg.Left(pos);
        strMsg = strMsg.Right(strMsg.GetLength() - pos - 1);
    }
    return str;
}

3.5 序列化實作

void CMsg::Serialize(CArchive& ar) {
    if (ar.IsStoring()) ar << m_strMsg << m_eType;
    else ar >> m_strMsg >> m_eType;
}

四、通訊協定流程

  1. 驗證:Client 送 LOGIN → Server 回 LOGINResponse。
  2. 通訊:Client 送 CHATTING/NOTICE → Server 依類型轉發 CHATTING/NOTICE/USERList。

五、伺服器端實作要點 (SDI + DAO + Windows Sockets)

5.1 關鍵成員變數 (CSuperServerView)

int m_iPort;
CSocketListen* m_pSocket;
CSocketClient m_SocketClient[Max];
CArchive *m_pArOut, *m_pArIn;
CSocketFile* m_pSF;
CMsg msg;

5.2 核心處理函式

void CSuperServerView::MyReceive(CSocketClient* pClient) {
    m_pSF = new CSocketFile(pClient);
    m_pArIn = new CArchive(m_pSF, CArchive::load);
    msg.Serialize(*m_pArIn);

    switch (msg.m_eType) {
    case LOGIN:
        // 驗證帳密,回覆 LOGINResponse,成功則 SendUserList()
        break;
    case CHATTING:
        // 依目標暱稱尋找對應 Socket 轉發
        break;
    case NOTICE:
        // 廣播給所有在線非發送者用戶
        break;
    }
}

void CSuperServerView::MyAccept() {
    for (int i=0; iAccept(m_SocketClient[i]);
            m_SocketClient[i].GetView(this);
            break;
        }
}

5.3 資料庫維護功能

新增/刪除/修改/查詢帳號,使用 CDaoRecordset 的 AddNew/Delete/Edit/Update 方法。

5.4 Socket 事件轉發

// CSocketListen
void OnAccept(int nErrorCode) { m_pView->MyAccept(); CSocket::OnAccept(nErrorCode); }

// CSocketClient
void OnClose(int nErrorCode) { m_pView->MyClose(this); CSocket::OnClose(nErrorCode); }
void OnReceive(int nErrorCode) { m_pView->MyReceive(this); CSocket::OnReceive(nErrorCode); }

六、客戶端實作要點 (對話方塊專案)

6.1 關鍵成員

CMsg msg;
CMySocket* m_pSocket;
CArchive *m_pArOut, *m_pArIn;
CSocketFile* m_pSF;

6.2 登入與接收迴圈

void CClientDlg::OnLogin() {
    // 建立 Socket、連線、送出 LOGIN 訊息
}

void CClientDlg::MyReceive() {
    msg.Serialize(*m_pArIn);
    switch (msg.m_eType) {
    case LOGINResponse: // 處理登入結果、顯示介面
    case USERList:      // 解碼填入列表框
    case CHATTING:      // MessageBox 顯示
    case NOTICE:        // MessageBox 顯示
    }
}

// CMySocket::OnReceive
void OnReceive(int nErrorCode) { m_pDlg->MyReceive(); CSocket::OnReceive(nErrorCode); }

七、介面截圖

伺服器主視窗、用戶端登入/主介面/收發訊息畫面見原文圖片。

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