- 消息:不同物理机器之间的信息传递的最小单位,以Json形式封装,传输协议使用Http或Tcp
- 双向:当消息发出之后,需等待对方响应,如此一问一答式的消息称为双向消息
- 单向:当消息发出之后,无需对方响应的消息称为单向消息,当使用Http协议传输单向消息时,服务器收到请求之后会立即发送空响应
服务器与服务器之间通信使用Http协议传输,服务器端与客户端使用Tcp和Http协议传输,当使用Http协议传输时,IM使用的方法为PUT方法,对应的路径为/:type/:subtype,其余消息内容放在body中,以Json形式予以存放,以下便是一个消息传输实例:
method: PUT
uri: /message/text
{
"to":"yangkui@w2v4.com",
"body":"你好吗?",
"version":0.2
}
以下是一个Tcp协议传输消息的例子:
{
"type":"message",
"subtype":"text",
"to":"yangkui",
"body":"你好吗?",
"version":0.2
}
值得注意的是,通过Http协议传输的Json中的type和subtype必填字段:双向消息通过Http协议传输,单向消息通过Tcp协议传输,仅登陆等消息亦会通过Tcp协议传输,Tcp协议使用"/r/n"拆包
消息使用Json格式封装,根据type类型分为大类,再根据subtype分为小类,其中type类型有:
用户类型(双向消息)
搜索类型(双向消息)
好友类型(单向消息)
消息类型(单向消息)
用户注册(双向消息)
用户登陆(双向消息)
离线消息(双向消息)
历史消息(双向消息)
method: PUT
uri: /
{
"type":"user",
"subtype":"register",
"id":"zxj2019",
"password":"431fe828b9b8e8094235dee515562247",
"password2":"431fe828b9b8e8094235dee515562247",
"nickname":"哲学家2019",
"version":0.4
}
传输时
password
和password2
为加密后的密码内容,使用MD5
进行加密。
响应
{
"register":true
}
或
{
"register": false,
"info": "用户名格式错误"
}
method: PUT
uri: /
{
"type":"user",
"subtype":"login",
"id":"zxj5470",
"password":"431fe828b9b8e8094235dee515562247",
"version":0.4
}
传输时
password
为加密后的密码内容,使用MD5
进行加密。
响应
{
"type":"user",
"subtype":"login",
"login":true,
"nickname":"哲学家",
"friends":[
{"id":"yangkui","nickname":"杨奎"},
{"id":"xiaopan","nickname":"小胖胖"}
],
"notifications":[
{"type":"friend","subtype":"request","from":"zhaoce","message":"请加我为好友"}
]
}
或
{
"login":false
}
登陆时需建立Tcp连接,并发送
{
"type":"login",
"id":"zxj5470",
"password":"431fe828b9b8e8094235dee515562247",
"version":0.4
}
以识别该连接
method:PUT
uri:/
{
"type":"message",
"subtype":"history",
"date":"2018-08-17",
"id":"zxj2017",
"password":"431fe828b9b8e8094235dee515562247",
"friend":"yangkui",
"version":"0.4"
}
查询2018-08-17之前的聊天记录,若此项为空,则读取最新的大于20条聊天记录。
响应
{
"message":true,
"history":[
{
"type":"message","subtype":"text","to":"zxj2017","body":"你好吗?","version":0.1,"from":"yangkui"
},
{
"type":"message","subtype":"text","to":"zxj2017","body":"你好吗?","version":0.1,"from":"yangkui"
}
]
}
或
{
"message":false
}
method: PUT
uri: /search/info
{
"type":"search",
"subtype":"info",
"keyword":"zxj2017",
"version":0.2
}
响应
{
"user":{"id":"zxj2017","nickname":"哲学家"}
}
或
{
"user":null
}
method: PUT
uri: /friend/request
{
"type":"friend",
"subtype":"request",
"to":"customer@w2v4.com",
"message":"请添加我为你的好友,我是哲学家",
"version":0.2
}
以下的 json 结果表示当前用户接受了来自to
用户的好友请求。
method: PUT
uri: /friend/response
{
"type":"friend",
"subtype":"response",
"to":"customer@w2v4.com",
"accept":true,
"version":0.2
}
method: PUT
uri: /message/text
{
"type":"message",
"subtype":"text",
"to":"yangkui",
"body":"你好吗?",
"uuid":"367d76c0962011e88dcb0b109a354f54",
"version":0.2
}
值得留意的是:每一个消息都建议添加uuid以便识别,虽然该域并非必需。