即时通讯编程(八)
作者:邵盛松 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 下调试通过