Objective C AsyncRPC 基本说明
主要模块的说明:
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,并进行调用。
- 对于RPCRequest:
发起一次RPC调用的基本流程:
- 通过RPCEntity发起RPC调用
- RPCEntity利用RPCCodec创建RPCRequest,并根据callid存储callback的block。
- 序列化RPCRequest(序列化binary数据,并利用TransportCodec封包)。
- 通过TCPConnection发送序列化数据。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论