在上篇博文中,我们学习了tbnet中有关socket封装的部分,个人感觉这部分的内容很重要,因为它主要涵盖了tbnet库所有的I/O部分,而今天我们要讨论的部分就是tbnet中的connect部分,从名字中就能看到这部分的作用,下面我们就来看看代码:
class Connection {
public:
/*
* ¹¹Ô캯Êý
*/
Connection(Socket *socket, IPacketStreamer *streamer, IServerAdapter *serverAdapter);
/*
* ÎöÔ캯Êý
*/
virtual ~Connection();
/*
* ÉèÖÃÊÇ•ñΪ•þÎñÆ÷¶Ë
*/
void setServer(bool isServer) {
_isServer = isServer;
}
void setIOComponent(IOComponent *ioc) {
_iocomponent = ioc;
}
IOComponent *getIOComponent() {
return _iocomponent;
}
/*
* ÉèÖÃĬÈϵÄpacketHandler
*/
void setDefaultPacketHandler(IPacketHandler *ph) {
_defaultPacketHandler = ph;
}
…
bool postPacket(Packet *packet, IPacketHandler *packetHandler = NULL, void *args = NULL, bool noblocking = tru
/*
* µ±Êý¾ÝÊÕµ½Ê±µÄ´¦Àíº¯Êý
*/
bool handlePacket(DataBuffer *input, PacketHeader *header);
/*
* ¼ì²é³¬Ê±
*/
bool checkTimeout(int64_t now);
/*
* д³öÊý¾Ý
*/
virtual bool writeData() = 0;
/*
* ¶ÁÈëÊý¾Ý
*/
virtual bool readData() = 0;
…
protected:
void disconnect();
protected:
IPacketHandler *_defaultPacketHandler; // connectionµÄĬÈϵÄpacket handler
bool _isServer; // ÊÇ•þÎñÆ÷¶Ë
IOComponent *_iocomponent;
Socket *_socket; // Socket¾ä±ú
IPacketStreamer *_streamer; // Packet½âÎö
IServerAdapter *_serverAdapter; // •þÎñÆ÷ÊÊÅäÆ÷
PacketQueue _outputQueue; // •¢ËͶÓÁÐ
PacketQueue _inputQueue; // •¢ËͶÓÁÐ
PacketQueue _myQueue; // ÔÚwriteÖд¦ÀíʱÔÝʱÓÃ
tbsys::CThreadCond _outputCond; // •¢ËͶÓÁеÄÌõ¼þ±äÁ¿
ChannelPool _channelPool; // channel pool
int _queueTimeout; // ¶ÓÁг¬Ê±Ê±¼ä
int _queueTotalSize; // ¶ÓÁÐ×ܳ¤¶È
int _queueLimit; // ¶ÓÁÐ×³¤¶È, Èç¹û³¬¹ýÕâ¸öÖµpost½øÀ´¾Í»á±»wait
};
从上述代码中可以看出,connection这个类包含的东西还是挺多的,我们就从成员变量说起吧,在conection中定义了接收数据包的一些处理句柄,例如_defaultPacketHandler这个变量,在上几篇博文中,曾经分析过了IPacketHandler类,这个类的主要作用就是用于实现对接收到的数据包的处理,而_streamer对象则是用于实现上层数据包与底层的缓冲区相互转换,_serverAdapter对象就是用于分情况处理接收到的数据包,其实就是适配器的作用,此外在connection中又包含了三个队列,一个输入队列,一个输出队列以及一个上层使用的队列,另外,我们还看到了一个_channelPool这个变量,这个变量的主要作用就是用于数据包传输时使用的通道池,至于这个通道池的作用,我们在下篇博文中会涉及到,在此只需要知道这个池就是记录从connection发送的数据包的标记即可,之后的三个变量就是用于设置队列的一些限制条件(超时时间、队列容量以及队列里数据包的个数),由于connection这个类在服务器和客户端都有涉及,所以在成员变量中设置了标志(isserver),这个标志的作用就是区分Server还是Client,至于iocomponent对象,想必大家都应该很清楚了吧,这个对象其实就是用于标记归属的,至于这个connection对象是属于哪个iocomponent,接下来,我们来看看一些比较重要的函数吧,代码如下:
bool Connection::postPacket(Packet *packet, IPacketHandler *pack