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

Socket 模擬 SOAP 訊息傳輸:三層架構下 XML 序列化與 CMarkup 解析實戰

     編輯:VC 教學

架構背景

圖書管理系統:客戶端 → 服務端 (業務邏輯) → 資料庫伺服器。服務端查詢後將記錄集序列化為 XML,包裝成 SOAP 訊息經 Socket 回傳客戶端解析顯示。

服務端:記錄集 → XML → SOAP 發送

// 1. 取得記錄集總筆數
int maxRows = 0;
while(!pRs->EndOfFile) { maxRows++; pRs->MoveNext(); }
pRs->MoveFirst();
int nFields = pRs->Fields->GetCount();

// 2. 使用 CMarkup 建立 XML
CMarkup xml;
xml.SetDoc(_T(""));
xml.AddElem(_T("RESULT"));
for(int i=0; iFields->GetItem(k)->GetName();
        _bstr_t val  = pRs->Fields->GetItem(k)->GetValue();
        xml.AddChildElem((LPCTSTR)name, (LPCTSTR)val);
    }
    xml.OutOfElem(); pRs->MoveNext();
}
xml.Save(_T("Temp.xml"));

// 3. 讀檔並 Socket 發送
CFile file; file.Open(_T("Temp.xml"), CFile::modeRead|CFile::typeBinary);
BYTE buf[64*1024]; memset(buf,0,sizeof(buf));
file.ReadHuge(buf, file.GetLength());
send(m_clientSock[i], (char*)buf, file.GetLength()+1, 0);
file.Close();

客戶端:接收 → 存檔 → CMarkup 解析 → 列表顯示

// 1. 接收資料存檔
CFile file;
file.Open(_T("Temp.xml"), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
file.WriteHuge(recvBuf, strlen(recvBuf));
file.Flush(); file.Close();

// 2. 載入並解析
CMarkup xml;
if(!xml.Load(_T("Temp.xml"))) { AfxMessageBox(_T("XML 載入失敗")); return; }

xml.ResetMainPos();
int item = 0;
while(xml.FindChildElem(_T("BOOK"))) {
    xml.IntoElem();
    m_listCtrl.InsertItem(item, _T(""), 0);
    CString idx; idx.Format(_T("%d"), item+1);
    m_listCtrl.SetItemText(item, 0, idx);

    int sub = 0;
    while(xml.FindChildElem()) {
        xml.IntoElem();
        CString val = xml.GetData();
        m_listCtrl.SetItemText(item, sub+1, val);
        xml.OutOfElem();
        sub++;
    }
    item++;
    xml.OutOfElem(); // 回到 RESULT
}

關鍵點總結

  • CMarkup 極大簡化 XML 生成/解析,強烈推薦
  • SOAP Envelope/Header/Body 此處簡化為自訂 <RESULT> 根節點,實際專案可補全標準 SOAP 結構
  • Socket 發送前需協議雙方約定封包長度 (定長頭、分隔符或 XML 結束標記)
  • 編碼統一用 GB2312 (中文環境) 或 UTF-8 (跨平台)

擴展建議

  1. 改用非同步 Socket (WSAAsyncSelect/IOCP) 提升併發
  2. 引入 SOAP Toolkit 或 gSOAP 自動處理序列化/反序列化
  3. 加入壓縮 (zlib) 與加密 (TLS) 強化傳輸
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved