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