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

Socket 模擬 SOAP 訊息傳輸:三層架構圖書管理系統實作

     編輯:關於VC++

問題背景

在三層架構的圖書管理系統中,包含客戶端、伺服器處理端與資料伺服器。客戶端發送請求,伺服器端透過 ADO 連接 Access 資料庫查詢,將結果格式化為 XML 並封裝成 SOAP 訊息透過 Socket 回傳客戶端,客戶端解析後顯示給使用者。

伺服器端:資料查詢與 SOAP 封裝

核心流程:接收請求 → ADO 查詢 → Recordset 轉 XML → 封裝 SOAP → Socket 發送

//************************ 封裝成 SOAP 訊息發送回客戶端 ************************//
int MaxRows = 0;  // 取得總列數
while (!pRs->EndOfFile) {
    MaxRows++;
    pRs->MoveNext();
}
pRs->MoveFirst();  // 必須移回第一列

int nFields = pRs->Fields->GetCount();  // 取得欄位總數

CMarkup xml;
xml.SetDoc("\r\n");
xml.AddElem("RESULT");
for (int j = 0; j < MaxRows; j++) {
    xml.AddChildElem("BOOK");
    xml.IntoElem();
    for (int k = 0; k < nFields; k++) {  // 取得欄位名與值
        _bstr_t name = pRs->Fields->GetItem((long)k)->GetName();
        _bstr_t value = pRs->Fields->GetItem((long)k)->GetValue();
        xml.AddChildElem((char*)name, (char*)value);
    }
    xml.OutOfElem();
    pRs->MoveNext();
}
xml.Save("Temp.xml");

// 讀取 XML 檔案並透過 Socket 發送
CFile file;
file.Open("Temp.xml", CFile::modeRead | CFile::typeBinary);
byte buf[64 * 1024];
memset(buf, 0, 64 * 1024);
file.ReadHuge(buf, file.GetLength());
send(m_sockClient[i], (char*)buf, file.GetLength() + 1, 0);
file.Close();

關鍵技術點:使用 CMarkup 類別簡化 XML 操作,作者特別感謝其作者的貢獻,並推薦大家使用此類別處理 XML 解析與生成。

客戶端:SOAP 訊息接收與解析

接收資料 → 存檔 → 載入 XML → 遍歷節點 → 顯示於 ListCtrl

CFile file;
file.Open("Temp.xml", CFile::modeCreate | CFile::typeBinary | CFile::modeWrite);
file.WriteHuge(recvBuf, strlen(recvBuf));
file.Flush();
file.Close();

CMarkup xml;
if (!xml.Load("Temp.xml")) {
    MessageBox("載入 XML 檔案失敗!");
    return;
}

int item = 0;
xml.ResetMainPos();  // 確保指標移至開頭
while (xml.FindChildElem("BOOK")) {
    int subItem = 0;
    xml.IntoElem();  // 進入 BOOK 節點
    m_listCtrl.InsertItem(item, "", 0);  // 插入一列
    CString index;
    index.Format("%d", item + 1);  // 序號
    m_listCtrl.SetItemText(item, subItem, index);
    
    while (xml.FindChildElem()) {  // 迴圈取得子節點值
        xml.IntoElem();
        CString value = xml.GetData();  // 取得值
        m_listCtrl.SetItemText(item, subItem + 1, value);
        subItem++;
        xml.OutOfElem();
    }
    item++;
    xml.OutOfElem();  // 離開 BOOK 節點
}

架構總結與改進建議

層級技術說明
資料層ADO + AccessRecordset 查詢結果集
邏輯層CMarkup + XML資料序列化為 XML
傳輸層Socket + SOAP原始 Socket 模擬 SOAP 傳輸
表現層CMarkup + ListCtrlXML 解析並顯示

改進方向:可考慮引入成熟的 SOAP 庫(如 gSOAP)、改用 HTTP 傳輸、加入 WSDL 定義、實作錯誤處理與重試機制,提升系統健壯性與互通性。

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