-
Notifications
You must be signed in to change notification settings - Fork 29
Protocol
zhoumengkang edited this page Dec 28, 2015
·
7 revisions
#ifdef PHP_WIN32
#pragma pack(push)
#pragma pack(1)
#endif
typedef struct _yar_header {
unsigned int id; // transaction id
unsigned short version; // protocl version
unsigned int magic_num; // default is: 0x80DFEC60
unsigned int reserved;
unsigned char provider[32]; // reqeust from who
unsigned char token[32]; // request token, used for authentication
unsigned int body_len; // request body len
}
#ifndef PHP_WIN32
__attribute__ ((packed))
#endif
yar_header_t;
#ifdef PHP_WIN32
#pragma pack(pop)
#endifyar header 是一字节对齐的,这样使得原本84字节的大小的结构体只需要82个字节来容纳,同时也使得不管什么语言在写入二进制流的时候都比较方便。
在yar中规定的传输协议如下图所示,请求体为82个字节的yar_header_t和8字节的打包名称和请求实体yar_request_t,在yar_header_t里面用body_len记录8字节的打包名称+请求实体的长度;返回体类似,只是实体内容的结构体稍微不同,在reval里面才是实际最后客户端需要的结果。
整个传输以二进制流的形式传送。
public class YarHeader {
private int id;
private short version;
private int magicNum;
private int reserved;
private String provider;
private String token;
private int bodyLen;
// get and set ...
}public class YarRequest {
private String packagerName;
private long id;
private String method;
private Object[] parameters;
// get and set ...
}传输时,会将YarRequest对象放入一个Map里,其key值比本身属性明更短,而这个Map里的key也属于Yar多语言交互的协议的一部分。
public static Map<String,Object> requestFormat(YarRequest yarRequest){
Map<String, Object> request = new HashMap<String, Object>();
request.put("i", yarRequest.getId());
request.put("m", yarRequest.getMethod());
request.put("p", yarRequest.getParameters());
return request;
}然后转成byte作为实体内容发送的服务端(如上图所示)
public byte[] pack(YarRequest yarRequest) {
Map<String,Object> request = requestFormat(yarRequest);
JSONObject jsonObject = new JSONObject(request);
String string = jsonObject.toString();
return string.getBytes();
}public class YarResponse {
private String packagerName;
private long id;
private int status;
private String out;
private String err;
private Object retVal;
// get and set ...
}解析返回的实体内容
public static YarResponse responseFormat(String data) {
JSONObject jsonObject = new JSONObject(data);
YarResponse yarResponse = new YarResponse();
yarResponse.setId(jsonObject.getLong("i"));
yarResponse.setStatus(jsonObject.getInt("s"));
yarResponse.setOut(jsonObject.getString("o"));
yarResponse.setRetVal(jsonObject.get("r"));
return yarResponse;
}如此就完成了数据发送与返回。
