Skip to content

Protocol

zhoumengkang edited this page Dec 28, 2015 · 7 revisions

Yar Header

yar_header c 原版

#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)
#endif

yar header 是一字节对齐的,这样使得原本84字节的大小的结构体只需要82个字节来容纳,同时也使得不管什么语言在写入二进制流的时候都比较方便。

yar中规定的传输协议如下图所示,请求体为82个字节的yar_header_t和8字节的打包名称和请求实体yar_request_t,在yar_header_t里面用body_len记录8字节的打包名称+请求实体的长度;返回体类似,只是实体内容的结构体稍微不同,在reval里面才是实际最后客户端需要的结果。

整个传输以二进制流的形式传送。

YarHeader Java bean

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 ...
}

数据的打包解包

YarRequest java bean

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();
}

YarResponse java bean

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;
}

如此就完成了数据发送与返回。

Clone this wiki locally