传输协议绑定
Hprose 远程过程调用(RPC)通讯可以在任何底层网络协议上传输。例如 HTTP,TCP 或 UNIX socket。
HTTP 绑定
当 hprose 远程过程调用(RPC)工作于 HTTP 之上时,hprose 远程过程调用(RPC)的数据作为 POST 请求的 body 部分发送,以响应的 body 部分返回。
Hprose 远程过程调用(RPC) 对 HTTP 的头部(head)没有任何特别的要求。
半双工套接字(Socket)绑定
Hprose 远程过程调用(RPC)也可以工作于 TCP 或 UNIX 套接字(Socket)之上。Hprose 远程过程调用(RPC)数据的长度以 BigEndian 的编码方式以 4 个字节的包头发送。Hprose 的数据作为包体部分直接发送,无需另外编码。例如:
- <0x00,0x00,0x00,0x18>Cs5"hello"a1{s5"world"}z # result = client.hello("world");
<0x00,0x00,0x00,0x18> 表示 4 个字节的 BigEndian 编码的整数 24。
应答格式同上类似。第一个字节的首位总是被设为 0
,这意味着包体的最大长度为 231 - 1(2147483647)个字节。
这个包头设计是为了可以更快更方便的处理套接字数据报中的数据。
全双工套接字(Socket)绑定
半双工套接字绑定易于实现,但是对连接的利用率不够高。所以我们也支持全双工套接字绑定方式。Hprose 远程过程调用(RPC)数据的长度仍以 BigEndian 的编码方式以 4 个字节的包头发送,但是第一个字节首位总是被设为 1
。该位并不是长度的符号位,因为长度总是正整数,它仅用于区别半双工还是全双工。接下来的 4 个字节表示请求的唯一标识(id)。这 8 个字节是包头。Hprose 的数据作为包体部分直接发送,无需另外编码。例如:
- <0x80,0x00,0x00,0x18><0x00,0x00,0x00,0x00>Cs5"hello"a1{s5"world"}z # 客户端请求
- <0x80,0x00,0x00,0x13><0x00,0x00,0x00,0x00>Rs12"Hello world!"z # 服务器端应答
- <0x80,0x00,0x00,0x10><0x00,0x00,0x00,0x01>Cs3"sum"a3{012}z # 客户端请求
- <0x80,0x00,0x00,0x18><0x00,0x00,0x00,0x02>Cs5"hello"a1{s5"world"}z # 客户端请求
- <0x80,0x00,0x00,0x13><0x00,0x00,0x00,0x02>Rs12"Hello world!"z # 服务器端应答
- <0x80,0x00,0x00,0x03><0x00,0x00,0x00,0x01>R3z # 服务器端应答
<0x80,0x00,0x00,0x18> 表示 4 个字节的 BigEndian 编码的整数 24。
<0x00,0x00,0x00,0x00>,<0x00,0x00,0x00,0x01>,<0x00,0x00,0x00,0x02> 是请求的唯一标识(id)。客户端使用它来处理请求和响应之间的对应关系。
WebSocket 绑定
Hprose 远程过程调用(RPC)也可以工作于 WebSocket 之上。 Hprose 远程过程调用(RPC)的数据以二进制数据的方式在 WebSocket 上发送和接收。
Hprose 远程过程调用(RPC)添加了 4 个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。
例如:
- <0x00,0x00,0x00,0x00>Cs5"hello"a1{s5"world"}z # 客户端调用
- <0x00,0x00,0x00,0x00>Rs12"Hello world!"z # 服务器端应答
- <0x00,0x00,0x00,0x01>Cs3"sum"a3{012}z # 客户端调用
- <0x00,0x00,0x00,0x02>Cs5"hello"a1{s5"world"}z # 客户端调用
- <0x00,0x00,0x00,0x02>Rs12"Hello world!"z # 服务器端应答
- <0x00,0x00,0x00,0x01>R3z # 服务器端应答
<0x00,0x00,0x00,0x00>, <0x00,0x00,0x00,0x01> 和 <0x00,0x00,0x00,0x02> 是请求唯一标识(id)。客户端使用它来处理请求和响应之间的对应关系。
再无其它特殊要求。