淘宝开源框架tbnet之connection

本文深入探讨了tbnet框架中的connection组件,包括其成员变量和关键函数,如处理数据包的流程、超时处理及队列管理。connection在服务器和客户端中扮演重要角色,通过适配器转发数据包,确保数据包正确处理和传输,同时介绍了其子类如tcpconnection和udpconnection的特点。下篇将讨论tbnet的事件处理机制。
摘要由CSDN通过智能技术生成

在上篇博文中,我们学习了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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值