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
叶子墙 阅读(1376)
评论(0) 编辑 收藏 引用