在上篇博文中,我们讨论了iocomponent这部分,个人认为在tbnet中在对网络数据包输入输出的处理上,封装的很不错的,对于那些想要做一些库开发方面的人有一定的借鉴作用,今天我们就来看看tbnet库中的其他几个类,主要是针对数据包的处理方面的,下面我们就来先看看tbnet库的ipacketstreamer这个类,这个类的作用根据网上的说法就是用于底层缓冲区与上次的数据包的交换处理类,个人还是比较认可这种说法的,下面先来看看其代码实现吧,代码如下:
class IPacketStreamer {
public:
/*
* ¹¹Ôì
*/
IPacketStreamer() {
_factory = NULL;
_existPacketHeader = true;
}
/*
* ¹¹Ôì
*/
IPacketStreamer(IPacketFactory *factory) {
_factory = factory;
_existPacketHeader = true;
}
/*
* Îö¹¹º
*/
virtual ~IPacketStreamer() {}
/*
* µÃµ½°üÍ·
*
* @param input Ô´buffe
* @param header ½á¹ûhea
* @return ÊÇ·ñ³É
*/
virtual bool getPacketInfo(DataBuffer *input, PacketHeader *header, bool *broken) = 0;
/*
* ¶Ô°üµÄ½âÂë
*
* @param input
* @param header
* @return ½âÂëºóµÄÊý¾Ý°ü
*/
virtual Packet *decode(DataBuffer *input, PacketHeader *header) = 0;
/*
* ¶ÔPacketµÄ×é×°
*
* @param packet Êý¾Ý°ü
* @param output ×é×°ºóµÄÊý¾ÝÁ÷
* @return ÊÇ·ñ³É¹¦
*/
virtual bool encode(Packet *packet, DataBuffer *output) = 0;
/*
* ÊÇ·ñÓÐÊý¾Ý°üÍ·
*/
bool existPacketHeader() {
return _existPacketHeader;
}
protected:
IPacketFactory *_factory; // ²úÉúpacket
bool _existPacketHeader; // ÊÇ·ñÓÐpacket header, ÈçhttpÓÐ×Ô¼ºÐÒé¾Í²»ÐèÒªÊä³öÍ·ÐÅÏ¢
};
在这个类中,首先来看看其成员变量,里面有个IPacketFactory对象,这个对象从名字上就能看出它的作用了,其实准确来讲它就是一个造数据包的工厂(使用了工厂模式),而具体的流程是在另外的两个函数中处理的,decode和encode,而这两个函数是虚函数,因而具体的实现需要看其子类,幸好在tbnet中已经实现了一个默认的数据包转换类(defaultPackets