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