-
Notifications
You must be signed in to change notification settings - Fork 45
4 进一步完善RPC Client
第3章和本章在代码提交记录上没有分类似3.1这样的分节,是一整章的提交记录,请知悉
前面章节的RPC Client外表看起来还不太像example/QuickStartDemo/HelloServer/Client里的使用方式,这一节的目标是完成向example中client使用方式的靠拢。
-
ObjectProxy类之前已经完成了对ip和port的封装
-
增加ServantProxy类对ObjectProxy的包装,即外界一般都通过ServantProxy来使用ObjectProxy
-
增加Communicator类对ServantProxy和CommunicatorEpoll的封装
-
增加HelloProxy类(继承于ServantProxy),完成对具体调用函数testHello的封装(包括了对ReqMessage初始化的封装)
-
tar_client_async_improve.cpp是本章的客户端
核心理解点是Communicator类通过stringToProxy方法,将实例化好的ServantProxy指针(父类指针)赋值给了HelloProxy指针(子类指针),HelloProxy指针负责请求的格式化和调度。这句话有点不好理解,事实上这部分代码对于初次阅读者可能都不太友好,不过没关系,我们可以从下面的模型示意图中理解上面这样玩法的用意。
-
第4步创建了多个CommunicatorEpoll线程
-
第6步创建了名为ppObjectProxy的ObjectProxy数组,注意ObjectProxy数组里的每一个ObjectProxy都是由具体的CommunicatorEpoll线程生成的
-
第7步中ServantProxy将ppObjectProxy数组指针赋值给了自己的私有成员变量_objectProxy,完成了对ObjectProxy的包装
-
第8步是转折点,HelloProxy是ServantProxy的子类,这一步中将第7步中的ServantProxy* sp赋值给了HelloProxy* prx,即父类指针赋值给了子类指针,这时候HelloProxy* prx里就继承了ServantProxy* sp中的所有内容,包括ppObjectProxy数组(ppObjectProxy数组在ServantProxy类中名字变为了_objectProxy)
-
第12步ServantProxy::selectNetThreadInfo函数中采取类似轮询方式(pSptd->_netSeq++)获取_objectProxy数组中的具体ObjectProxy。每个ObjectProxy都会指向一个具体的CommunicatorEpoll线程,所以ObjectProxy就承担了通知其对应的CommunicatorEpoll线程接收请求的职责