即时通讯编程(八)

即时通讯编程(八)

作者:邵盛松  2009-06-04   QQ:346646173

目的:开发基于XMPP(Extensible Messaging and Presence Protocol)协议的即时通讯。
开发工具: Visual C++ 2005

本篇文章主要内容私聊功能的实现。发送和接受时注意数据的类型的转换。

一界面设置
显示你和对方的聊天信息的RichEdit2控件设置
变量命名
CRichEditCtrl m_Rich_ctrlChatYou;
CString m_Rich_strChatYou;
属性设置
ReadOnly 设置为true
Multiline 设置为true 
Want Return设置为true
vertical Scroll设置为true

将输入聊天内容的RichEdit2 控件设置
变量命名
CRichEditCtrl m_Rich_ctrlChatMe;
CString m_Rich_strChatMe;
属性设置
Multiline 设置为true 
Want Return设置为true
vertical Scroll设置为true
处理接收数据,将接受的数据写入数据,然后在界面显示

二 数据库的实现
创建数据表

CREATE TABLE TB_JABBERMESSAGE (
    JID       VARCHAR(100),
    JMESSAGE  BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ISLOOK    SMALLINT DEFAULT 0
);
JMESSAGE字段表示接受的信息
ISLOOK表示这条信息是否已经查看 0没有看到,1表示看到

三消息的实现
void CConnectionManagement::handleMessage( Stanza *stanza, MessageSession * /*session*/ )//add para
{
CString strRemoteJID=UTF8ConvertUnicode( stanza->from().full().c_str());
 CString strRemoteJMessage=UTF8ConvertUnicode( stanza->body().c_str());
int cur=strRemoteJID.Find('/');
 if(cur!=-1)//没有找到
 {
  
  strRemoteJID=strRemoteJID.Left(cur);
 }
 //JID部分只要用户名或主机名称部分,去掉resource部分
 try
 {

  HRESULT hr4=m_pRs1->Open(_T("TB_JABBERMESSAGE"),m_pCon.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdTable);
  if(FAILED(hr4))
   return;
  if (!m_pRs1->Supports(adAddNew))
   return;
  m_pRs1->AddNew();
  m_pRs1->ADOFields->GetItem(_variant_t("JID"))->Value=_bstr_t(strRemoteJID);
  m_pRs1->ADOFields->GetItem(_variant_t("JMESSAGE"))->Value=_bstr_t(strRemoteJMessage);

  /**************************************************************************************************/
  m_pRs1->Update();//更新添加
  hr4=m_pRs1->Close();//关闭记录集
  bDialogShow=true;//界面可以显示
 }

 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
 }

   m_messageEventFilter->raiseMessageEvent( MessageEventDisplayed );
 Sleep( 1000 );
 m_messageEventFilter->raiseMessageEvent( MessageEventComposing );
 m_chatStateFilter->setChatState( ChatStateComposing );
 Sleep( 2000 );
}


 if(bDialogShow==true)
   {
     //开始显示数据
     try
     {
    _variant_t vFieldValueMessage;
       
       CString strSQL=_T("SELECT * FROM TB_JABBERMESSAGE WHERE JID='")+strJID+_T("/' AND ISLOOK='0'") ;
    
       HRESULT hr3=m_pRs1->Open(_variant_t(strSQL),m_pCon.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);
    
       if (SUCCEEDED(hr3))
       {
        while (!m_pRs1->EndOfFile)
        {
         
         vFieldValueMessage=m_pRs1->GetCollect(_T("JMESSAGE"));
         
        if (vFieldValueMessage.vt!=VT_EMPTY && vFieldValueMessage.vt!=VT_NULL)
        {
         UpdateData(true);
         m_Rich_strChatYou=m_Rich_strChatYou+vFieldValueMessage.bstrVal+_T("/n");
         UpdateData(false);
        }
         
         m_pRs1->MoveNext();
        }
        hr3=m_pRs1->Close();//关闭记录集
       }
     }
      catch(_com_error e)
      {
       AfxMessageBox(e.ErrorMessage());
      }
     bDialogShow=false;


     CString strSQL;
     strSQL=_T("UPDATE TB_JABBERMESSAGE SET ISLOOK='1' WHERE JID='")+strJID+_T('/'');
     m_pCon->Execute((_bstr_t)strSQL,NULL,adCmdText);
//已经查看的数据,标志设置为1
    }


将界面的数据发送出去
UpdateData(true);
 CTime time = CTime::GetCurrentTime();
 CString strTime= time.Format(_T("%Y-%m-%d %H:%M:%S"));
 m_Rich_strChatMe=strDlgCaption +_T("  ")+strTime+_T("/r/n")+m_Rich_strChatMe;
 m_Rich_strChatYou=m_Rich_strChatYou+m_Rich_strChatMe+_T("/r/n");
 /************************************************************************/
 CString strMe=m_Rich_strChatMe;
 CStringA   strMessage;
 strMessage=strMe.GetBuffer(0);
 strMe.ReleaseBuffer(); 
 std::string stdstrSendMessage(strMessage.GetBuffer(0));  
 strMessage.ReleaseBuffer();
 /************************************************************************/
 CStringA   strA;
 strA=strJID.GetBuffer(0);
 strJID.ReleaseBuffer(); 
 std::string stdstrRemoteJID(strA.GetBuffer(0));  
 strA.ReleaseBuffer();
 JID RemoteJID( stdstrRemoteJID);
 mess = new MessageSession(j,RemoteJID);
 mess->send(stdstrSendMessage);
 j->disposeMessageSession(mess);
 m_Rich_strChatMe=_T("");
 UpdateData(false);

以上在 Visual C++2005 下调试通过

你可能感兴趣的:(即时通讯编程(八))