CBasicFamilyParser處理基本協(xié)議族的收發(fā)包,它的代碼很簡單,但作用很重要,它對基本協(xié)議族的支持包括:
要發(fā)送包的只要傳進(jìn)來一個(gè)CQQUser對象(由這個(gè)對象提供要發(fā)送包的參數(shù)),指定命令號(hào),就會(huì)生成一個(gè)CBasicOutPacket派生類對象,而這個(gè)CBasicOutPacket派生類對象會(huì)送到發(fā)送隊(duì)列中,由發(fā)送隊(duì)列統(tǒng)一調(diào)配發(fā)送時(shí)間,決定需不需要重發(fā),收沒收到反饋等等,發(fā)送隊(duì)列以后再詳細(xì)說明,這里只提到發(fā)送一個(gè)包并不是直接做一個(gè)二進(jìn)制buffer,通過socket發(fā)出去的,而是生成一個(gè)CBasicOutPacket派生類對象,提交給發(fā)送隊(duì)列,發(fā)送隊(duì)列會(huì)對所有CBasicOutPacket派生類對象統(tǒng)一管理,決定每個(gè)包的發(fā)送時(shí)間,重發(fā)次數(shù),以及收到Ack刪除對應(yīng)的包等等
收到的原始數(shù)據(jù)(二進(jìn)制數(shù)據(jù))通過它轉(zhuǎn)換為CBasicInPacket派生類對象,這個(gè)CBasicInPacket派生類對象根據(jù)不同的包類型有不同的用途,比如向上層報(bào)告收到的聊天消息,好友狀態(tài)變更,系統(tǒng)消息,或者是發(fā)送包的Ack包,則提交給發(fā)送隊(duì)列,讓發(fā)送隊(duì)列刪除收到Ack包的發(fā)送包(否則這個(gè)包會(huì)重發(fā))
CBasicFamilyParser類接口非常簡單,對外有CreateOutPacket生成發(fā)送包對象和ParseInPacket生成接收包對象。這個(gè)類在每引入一對發(fā)送/接收包都會(huì)改變,由于目前還沒有介紹一個(gè)CBasicIn/OutPacket派生類,所以目前的CreateOutPacket和ParseInPacket都是空的
比如請求登錄包/應(yīng)答包是CRequestLoginTokenPacket/CRequestLoginTokenReplyPacket,那么CreateOutPacket代碼中會(huì)有
if( sCommand == QQ.QQ_CMD_REQUEST_LOGIN_TOKEN )
{
pBasicInPacket = new CRequestLoginTokenReplyPacket(pQQUser);
}
而ParseInPacket代碼中會(huì)有
if( sCommand == QQ.QQ_CMD_REQUEST_LOGIN_TOKEN )
{
return new CRequestLoginTokenPacket(pQQUser);
}
依此類推
代碼svn:
https://vcye23.svn.sourceforge.net/svnroot/vcye23/qqprotocol/引用請注明出處,謝謝
posted on 2007-10-17 02:59
葉子墻 閱讀(1414)
評(píng)論(0) 編輯 收藏 引用