通信协议设计
协议为了方便c#,js,java等语言的处理,采用json字符串。
JSON请求示例:
//请求格式
{
"PktType": "GetUserInfo",
"Token": "xxxxxxxxxxxx",
"No": "3",
"Ctrl": 0,
"Params": {
"id": 10
}
}
说明:
- PktType,用于识别报文的功能 。(通常查询用Get开头,编辑用Set开头)
- Token,用户识用请求者的身份,服务器用户匹配请求者的相关信息。
- No,可选,通常用于应答报文与请求报文进行匹配。
- Ctr,可选,通常定义: 0,查询;1,插入;2,修改;3, 删除 (不带此字段,为默认为0)。
- Params,参数信息(参数中的字段采用小写加_连接),常用字段举例:
- start 查询起始序号,无此字段或等于0时,采用默认值。
- size 单页查询行数 , 无此字段或等于0时,采用默认值10。
C#对请求报文的解析
public class SocketCom //通用请求消息
{
public string PktType { get; set; }
public object Params { get; set; }
public int Ctrl { get; set; }
public string Token { get; set; }
public int No { get; set; }
}
说明:
- 所有协议的报文,结构体尽量通用,减少结构的量。因为c#解析josn,需要先定义结构体,然后解来装入。
- c#生成object对像,采用new实现。例如:
var Param=new {xx=1,xx1="xx"}
JSON应答示例:
//应答格式
{
"PktType": "RtGetUserInfo",
"Token": "xxxxxxxxxxxx",
"No": "3",
"Ctrl": 0,
"StatusCode": 0,
"Status": "OK",
"ListMsg": {
"mch_id": "1484492872",
"notify_url": "http://www.suianbo.com/index.html",
"out_trade_no": "TEST1"
},
"Table": [
{
"id": 1,
"name": "姓名1"
},
{
"id": 2,
"name": "姓名2"
}
],
"List": {
"ColumnNo": {
"id": 1,
"name": 2
},
"ListData": [
[
"1",
"姓名1"
],
[
"2",
"姓名2"
]
]
}
}
C#对应答报文解析
public class RtSocketCom //通用应答消息
{
public string PktType { get; set; }
public object Params { get; set; }
public object ListMsg { get; set; }
public DataTable Table { get; set; }
public int Ctrl { get; set; }
public string Token { get; set; }
public int No { get; set; }
public string Status = "Fail";
public int StatusCode = -1;
}
说明:
- 定义上面的解析结构体,用于将字符串的json解来装入。
- 解析方法如下,图中pktStr为json格式的字符串,RtSocketCom为用来装json数据的结构。
- 上面解析后,像
ListMsg
这样的对像,还需要根据实际内容再解,如下图:
- 上图中
JObject
是json解析库Newtonsoft.json
里的class。