CBaseClient类
CBaseClient 类是fdbus的客户端类,fdbus的基础是客户端和服务端,通过这个类可以构造客户端类,下面将详细的介绍下该类的构成。
CBaseClient UML类图
上图是CBaseClient类的组织关系图。
基类介绍
CBaseEndpoint
该类的含义是端点,在网络中无论是客户端还是服务端他们都可以抽象为端点,他们的共性抽象成为了CBaseEndpoint类,下面我把我自己对这个类的一些理解放在下面不一定正确,希望对大家有所帮助。
- 每个端点都对应一个网络节点,每个端点与其他网络端点建立一条连接就表示一条会话(session),一个端点可以存在多个会话。这些会话会保存到一个容器中。每个会话都会分配一个socket,以socket作为标识符,用于识别每个会话对象。
- 该类抽象了一些网络操作的方法,例如使能UDP(enableUDP)、设置阻塞模式等相关方法、注册会话(registerSession),去注册会话(unregisterSession)
疑问
端点对象的基类是CFdbBaseObject,那CBaseEndpoint与CFdbBaseObject的关系应该怎样的呢?按照类的关系理解来说,每个CBaseEndpoint对象都是一个CFdbBaseObject对象或者说包含CFdbBaseObject对象。但是从CBaseEndpoint类的方法来说,存在addObject和removeObject的方法,那这两个方法操作的对象指的是什么呢?
CEntityContainer<FdbSocketId_t, CFdbSessionContainer *>
通过名字就可以看出这个一个容器类,用于根据socketid标识符作为key,来保存senssion对象,该类提供的方法均为操作操作该容器类。这个容器类是利用map实现的。
需要注意的是就是这个类中提供了两个方法:allocateEntityId和allocateUniqueEntityId。这两个方法是进行了一个计数行为,通过查看源码我认为这两个值是对该端点有多少个会话进行统计的。
CFdbBaseObject
该类从字面意思理解就是fdbus的基础子类,该类提供了一系列的触发不同网络端点之间通信的方法,上图中将主要的方法都列了出来,下面一一讲解他们的作用。
- invoke:CFdbBaseObject类对该方法做了重载,有多种形式的调用。该方法的作用就是实现客户端到服务端或者服务端到客户端的方法调用,其实就是远程进程调用(rpc),通过这个方法可以实现不同应用程序之间同步或者异步的调用,若要实现同步调用或者异步调用,调用不同的invoke方法即可,也可以参考源码头文件,里面明确哪个invoke方法是同步还是异步。该方法客户端或者服务端都可以调用。
- subscirbe:CFdbBaseObject类同样都对函数进行了多个重载,存在多种不同的调用形式,该方法的作用是实现客户端向服务端订阅消息。如果不调用该函数,那么服务端掉执行broadcast方法时,客户端是无法收到消息。该方法只能由客户端调用。
- broadcast:CFdbBaseObject类对该方法做多个重载,这个方法很简单就是用于服务端向客户端广播消息,但是广播消息发送时还是依据订阅的消息实现的,有点类似于dds的发布订阅。这个肯定跟invoke这种有所区别,这个方法都是异步的。该方法只能由服务端调用。
- send:该方法也存在多个重载,他的实现是对invoke函数的封装,也就是说是基于invoke实现的,他于invoke的区别是send设置了NO_REPLY标志,而invoke方法一般都没有设置设置该标志。也就是说send是没有回复的。该方法客户端和服务单都可以调用。
- publish:该方法也存在多个重载,这个方法有意思,从字面意思理解就是发布消息,与broadcast类似,但是有意思的是broadcast仅能服务端调用,而publish方法却支持客户端和服务端进行发布,也就是说客户端也可以通过publish对外发布消息。该方法客户端和服务端都可以调用。通过查看源码,当客户端调用publish时,它的逻辑是将消息发送给服务单,再由服务端调用broadcast方法进行广播,本质上还是服务端进行了广播,而不是客户端自己实现的广播。
- onOnline:该方法是当客户端或者服务端上线时,客户端或者服务端的该方法都会被调用,用于通知客户端或者服务端上线。
- onInvoke:这是一个虚函数,客户端对象或者服务端对象需要如有必要需要实现这个虚函数,用于处理来自其他端点对本端点的访问。
- onBroadcast:这是一个虚函数,仅客户端需要实现这个虚函数,当服务端调用broadcast方法时,会调用客户端的该方法。该方法仅能客户端去实现。
- onReply:这是一个虚函数,他的作用是收到对端的回复时会进入该该方法,但是仅当异步调用时才会进入该方法,如果请求的一方发送的消息对象是同步调用,例如利用invoke同步调用时,服务端调用reply方法返回时,则不会进入onRply方法;若是invoke异步调用,则会进入onReply。
- onPublish:当对端调用publish方法时,接收消息的一端会进入该方法,用于处理publish请求。
- role:每个对象都有保存自己的角色,即是客户端还是服务端。
其他的方法不在这里一一介绍。
CBaseClient
该类的基类是CBaseEndpoint,前面已经讲过,CBaseEndpoint类是将服务端和客户单的一些共享抽象出来的类,而作为其子类CBaseEndpoint肯定是只有客户端相关的一些特性。这里只有只有两个比较重要的方法:
- connect:顾名思义,该方法就是用于连接服务端
- disconnect:从服务器断开连接
CBaseServer
CBaseServer UML类图
基类介绍
CBaseServer 类的基类与CBaseClient一样,故这里不在进行单独介绍。
这里只介绍CBaseServer 的比较重要的方法。
- bind:绑定服务器
- unbind:解绑服务器