当前位置:
首页 >
Netplus里的基本概念
发布时间:2023/12/18
77
豆豆
生活随笔
收集整理的这篇文章主要介绍了
Netplus里的基本概念
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
本文为初见,Netplus快速开始之PingPong Example系列第三篇
1. netp::ref_ptr & netp::ref_base
C++是一门面向对象的语言,一切皆可为对象,然对象的创建与销毁,指针的传递、共享,在稍大一点的工程里面,如豆腐雕花,如履薄冰,一不小心,直接崩坏,尤其是引入多线性以及异步编程之后,更是令人心力交瘁,这种动不动就出王炸的逆天脾气,常使得开发者谈C色变。
那么对象的管理,到底有没有好一点的办法呢,netplus选择了ref_ptr&ref_base, 顾名思义,这是一种基于引用计数的对象管理机制,因篇幅关系,这里暂时只讲如何使用它。
- 在Netplus里面,绝大部分的class都继承于ref_base,ref_base作为根,提供引用计数的基本功能。
- 继承自ref_base的class,直接new/delete 的时候,编译器会报错。
- 继承netp::ref_base的class,需要配合模板netp::ref_ptr<T>进行使用。
- netp::ref_ptr<T>对象,只能通过netp::make_ref<T> 进行创建,不需要的时候,需赋值为nullptr。
- 每赋值给一次,引用计数增1,每被置nullptr一次,引用计数减1,当减到0的时候,其指向的内存将被回收,赋值是线程安全的。
- netp::ref_ptr<T>可以如指针 T* 一样用来访问其指向的对象。
- sizeof(netp::ref_ptr<T>) == sizeof(T*)。
- 更详细的知识,请参:
Netplus 之 Smart Pointergithub.com
- 下面是一个关于 ref_ptr&ref_base 的example
是不是觉得,c++的对象管理也可以很自然,很简单,很符合直觉。^_^
2. Packet
- Packet是Netplus的一个重要Class, 继承自netp::ref_base,它提供用于读写bytes buffer的接口,是我们用来操作bytes buffer的工具。
- 网络编程中,当处理Bytes Buffer,特别是处理protocol时,我们需要读或修改头部,或直接往头部前面添加一些数据。Packet被专门设计成应对这种场景,它既可以往buffer的左边写,也可以在buffer末端往前写,于是,处理起来将变得极为方便。
- Channel将收到的bytes, 存储在Packet对象里面,然后再将此对象传递给它的第一个Handler。
- 往远端写bytes的时候,我们也是将bytes存储于一个Packet对象,然后最终传递给Channel。
- Example:
3. Channel
- Channel是网络通信的主体,它即是当前的连接,它也是最终与操作系统进行交互,读写bytes,以及socket状态管理的实体。
- 每一个Channel可以添加一个多个Channel Handler,Channel Handler以单向链表的形式链接在一起,当与Channel相关的事件发生的时候,Channel负责将事件传递给第一个Channel Handler。
- 一个典型的channel read事件,按下面顺序在Handler中传递
- 一个典型的channel write事件,按下面顺序在Handler中传递
- 每一个handler在创建的时候都会包含一个tail handler, 一个head handler,用于处理缺省行为
4. Channel Handler
- Channel Handler是具体处理我们的消息的地方,处理完消息后,我们可以继续传递一个消息给下一个Handler,或直接终止当前消息的逻辑处理,甚至接关闭当前的Channel。
- Channel Handler需要继承 netp::channelhandler_abstract, 实现相应接口,用于处理网络事件,消息。
- 更多细节,请参:
Netplus 之 Concepts
- 在我们的例子中,我们将用到如下Channel handler接口
下文我们聊一下在Netplus里面,实现一个服务器,客户端的基本流程
写代码的冰冰
总结
以上是生活随笔为你收集整理的Netplus里的基本概念的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: server是什么意思
- 下一篇: 以心换心,将心比心----项目经理要学会