Objective C AsyncRPC 基本说明 - 文章教程

Objective C AsyncRPC 基本说明

发布于 2020-11-06 字数 2434 浏览 1092 评论 0

主要模块的说明:

TCPConnection

封装了 GCDAsyncSocket,主要就是维护 TCP 链接,负责发送数据和等待接受数据。收到数据之后就直接把data转交给自己的·TCPConnectionDelegate·(在现在的代码里是RPCEntity实现了这个delegate)。

RPCEntity

RPC 的发起和 RPC 请求处理的主要实体,一方面会将通过entity发起的RPC请求经过合适的序列化方法变成字节流通过TCPConnection发送出去,另一方面也会利用合适的编解码器解析从 TCPConnection 接收到的数据,并dispatch给响应的service(实现了 RPCServiceDelegate 的对象)去处理。RPC的callback也是在 Entity 里维护的。

RPCRequest / RPCResponse

对 RPC 请求和 RPC 响应的一个封装。提供了对自己序列化的方法,可以供派生类继承后使用自己的序列化协议重写。

TransportCodec

用来处理数据的封包解包。目前定义的封包格式是这样:

struct TransportFormat __attribute__ ((__packed__))
{
   int32_t  len;
   char     packageData[len];
}

RPCCodec

对RPC请求和响应的序列化和反序列化。基类提供最基本的接口,用来创建 RPCRequest 和 RPCResponse。同时对于从网络接收到的流数据,每次接收都判断当前buffer里的数据是不是构成了一次完整的RPC请求或者响应。如果是一个完整的消息,就生成消息,并且转交给 RPCCodecDelegate 去处理,在目前的代码里是RPCEntity实现了这个RPCCodecDelegate

处理一次 RPC 请求或者响应一个基本的流程是:

  • TCPConnection接收到数据
  • 数据转交给RPCEntity(实现了TCPConnectionDelegate)
  • RPCEntity把数据交给RPCCodec
  • RPCCodec的buffer里的数据构成了一个完整的RPCRequest或者RPCResponse之后,把生成的RPCRequest/Response对象传给RPCEntity(实现了RPCCodecDelegate)进行处理
    • 对于RPCRequest:
      • RPCEntity把RPCRequest转交给RPCService处理,并得到的返回值
      • 用返回值构造RPCResponse
      • 序列化RPCResponse(首先序列化成binary数据,并经过TransportCodec封包)
      • 通过TCPConnection传给server端。
    • 对于RPCResponse:
      • RPCEntity根据RPCResponse中的callid去查询自己之前的callid记录
      • 找到callid对应的callback的block,并进行调用。

发起一次RPC调用的基本流程:

  • 通过RPCEntity发起RPC调用
  • RPCEntity利用RPCCodec创建RPCRequest,并根据callid存储callback的block。
  • 序列化RPCRequest(序列化binary数据,并利用TransportCodec封包)。
  • 通过TCPConnection发送序列化数据。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

2583 文章
29 评论
84935 人气
更多

推荐作者

猫性小仙女

文章 1 评论 0

qq_VO6LhT

文章 0 评论 0

猿舌电影

文章 0 评论 0

7556275422

文章 0 评论 0

YYQ_139

文章 0 评论 0