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