Objective C AsyncRPC 基本说明

发布于 2020-11-06 20:03:22 字数 1869 浏览 1322 评论 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发送序列化数据。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

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

0 文章
0 评论
84960 人气
更多

推荐作者

遂心如意

文章 0 评论 0

5513090242

文章 0 评论 0

巷雨优美回忆

文章 0 评论 0

junpengz2000

文章 0 评论 0

13郎

文章 0 评论 0

qq_xU4RDg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文