程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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"?>
");
      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