程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Socket模擬SOAP消息

Socket模擬SOAP消息

編輯:關於VC++

問題的提出:

我做了一個圖書管理系統,是用三層結構實現的,客戶端,服務器處理端和數據端。客戶端提出請求,服務器端響應,同時將從數據服務器得來的結果以SOAP消息發送回客戶端,客戶端解析SOAP消息,將結果顯示給用戶。

實現方法:

好了,話不多說,現在開始進入正題:

在接到客戶端發來的請求後,我用ADO連接數據服務器並查詢(我用的是Access),得到結果集Recordset以後,將結果集中有關圖書信息格式化成XML文檔,將其以SOAP消息形式發送回客戶端

//************************封裝成SOAP消息發送回客戶端************************//
      int MaxRows=0;//用來獲得總的行數
      while(!pRs->EndOfFile)
      {
        MaxRows++;
        pRs->MoveNext();
      }
      pRs->MoveFirst();//這是必須的,現在記錄已是最後一行了

      int nFields;
      nFields=pRs->Fields->GetCount(); //得到字段總數

      CMarkup xml;
      xml.SetDoc("<?xml version=\"1.0\" encoding=\"GB2312\"?>\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");
      //MessageBox("xml文件生成成功");
      CFile file;
      file.Open("Temp.xml",CFile::modeRead | CFile::typeBinary);
      byte buf[64*1024];
      memset(buf,0,64*1024);
      file.ReadHuge(buf,file.GetLength());
      //用socket發送
      send(m_sockClient[i],(char *)buf,file.GetLength()+1,0);
      file.Close();

在這裡我要說明一下,在解析XML文件的時候,我借用了CMarkup類,十分感謝它的作者,因為他們的努力使得我們在解析XML文件的時候可以輕而已舉,這裡再一次感謝他們!也推薦大家在解析XML文件的時候不妨試試這個類,非常的好用!

上面的代碼還比較好懂,我也就不多解釋什麼了(高手們可別笑話我哦~~)

在接受到服務器端的SOAP消息後,客戶端就可以解析SOAP消息並把結果顯示出來了:

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(); //make sure to move the point to the begin
  while (xml.FindChildElem("BOOK"))
  {
    int subItem=0;
    xml.IntoElem(); //into 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(); //得到值
      //MessageBox(value);
      m_listCtrl.SetItemText(item,subItem+1,value);
      subItem++;
      xml.OutOfElem();
    }
    item++;
    xml.OutOfElem(); //out BOOK
  }

好了,這就是格式化SOAP消息和解析SOAP消息主要的部分,這是本人的一點心得,願與大家一起分享,有不對之處還請大家多多指教。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved