Skip to content

Latest commit

 

History

History
66 lines (59 loc) · 5.83 KB

protocol.md

File metadata and controls

66 lines (59 loc) · 5.83 KB

消息格式与通信协议

消息协议部分类似于http2协议,由命令行、参数行和消息内容构成。此协议的设计原则是能够在分布式系统中实现消息的快速响应,在同一个连接中,可对多个 较大的消息进行交叉发送,并保证长度较小的消息进行优先发送。对于包含文字、图片、音频等多个元素的信息,可先将文字、图片和语音等元信息首先 通过一条信息发送,然传再输信息的剩余部分,这样信息在用户端能够实现快速显示和预览,对于语音等,收听和传输可同时进行,实现信息的快速传递 和响应。

术语

**消息:**用户发送的一条消息,该条消息可包含多个子消息,是逻辑实体,消息通过多个“消息帧”进行传输

**消息帧:**网络传输中的一个包或者帧,是传输的实体,意义是将“消息”分割成多个小的条目进行传输

以下的对命令行、参数行和消息内容的规范为对“消息帧”的规范。

命令行

命令行由关键字“CMD”开始,用于表明一条消息帧的开始,后面跟随“命令”,或者称“消息类型”。请求行以“\r\n”结束。命令行中所有字符必须都是 ascii字符。命令行的“命令”为小写字符构成,可包含一个或单个单词,多个单词之间以“_”进行分割。举例:“CMD login”,“CMD get_contacts”。

参数行

参数行由参数名、“:”和参数值构成,参数行中所有字符都必须为ascii字符。每个参数占一行,以“\r\n”结束。参数名和参数值前后可包含空白字符, 解析时需要移除这些空白字符。最后一个参数行由“\r\n\r\n”结束,代表所有的参数都结束,接下来的数据就是消息内容。参数行中的预定义标准参数 名包括:“size”,“uuid”,“chunk”,“offset”,“type”、“checksum”,“from”和“to”,其中size每个消息帧中 必须包含的参数。各个参数的释义如下:

size:size代表消息内容的长度,单位为字节(byte),以十进制整数表示,如“243”,代表243字节。
uuid:uuid是一个唯一标识,代表在系统内的某个实体资源,如消息,数据信息。若消息内容为“消息(用户发送的消息)”类型,或者采用 了“chunk”模式,则必须指定“uuid”参数,该参数值为一个uuid。
chunk:若参数行包含该参数,说明该帧的消息内容不是一个完整的消息,而是一个消息中的部分信息。若使用了此参数,则必须指定”uuid“。此 外,还可选包含”offset“和”total“参数,服务器端可根据这两个值实时将消息保存到文件中。本参数值的格式为”3/5“,表示消息一共分为5个块传输, 该块是第3个。
offset:offset是指该帧中的内容在原始消息数据中的偏移量。只有在参数行中包含”chunk“参数时此参数才有意义。参数值的格式 为”2324/453453“。代表原始数据共有453453字节,该帧中的数据的偏移量在第2324字节,偏移量起始位置是”0“。之所以在每帧中都包含”总长度“ 这以信息,是因为无法保证每个帧是按顺序发送或按顺序到达,无法通过第一帧中的数据来得知总长度。
type:代表消息的类型,同http中的Content-Type,若未包含该参数,则默认为utf-8编码的字符串。各个命令可不依赖该参数。
checksum:表示消息内容的crc32校验和,以10进制整数来表示。若收到的消息中包含该字段,则应该对消息体进行校验并与该字段的值进行对 比,若不相等,则应该丢弃此条消息。
from:代表数据的发送者,只有在数据是由服务器发往客户端,并且是由另一个用户发送给该客户端时,消息中才会包含此字段。该值需要能够 唯一标识一个用户。
to:代表消息发往的目标用户,只有在消息是发给其他用户时,才会包含此参数。

除了标准参数,各个命令还可以自定义参数。

消息内容

消息内容为该消息帧中所携带的数据,其格式可为任意类型。消息体的处理需要根据参数行中的“type”来决定。

消息示例

CMD logout\r\n\r\n

CMD message\r\n
size: 20\r\n
uuid: 2a4fd4a4-9373-11e6-b1b1-b46d8361714b\r\n
class: wrapper\r\b
from: 1232\r\n
to: 3522\r\n\r\n

I AM THE MSG BODY...

标准命令(CMD Type)

用户的发送的信息由message和element两种类型组成,实现用户之间以多种信息形式进行聊天。本协议只规定这两个核心的消息类型。其他消息类型和 响应的参数由具体应用程序决定。

message

message命令用来在用户之间发送和接收消息。message命令额外必须要包含的参数有“uuid”、“from”或“to”、“class”。其中“class”参数的意思是 那种类型的消息,如文本,图像。

wrapper类型

若消息的class等于“wrapper”,则说明这是一个复合消息,其消息内容包含来其他类型的消息。wrapper类型消息的内容是一个字符串,为一个 json数组数组中的每一项是一个单独的消息,若该项是字符串类型,则该字符串就是该项的消息实体。除字符串外,其他元素用json对象表示,每个对 象必须有uuid属性,用来表明此元素的所对应的消息实体,除uuid外,还可包含对应实体的元信息。
["你好,这是我的第一条信息"]

["请看这张图", {"uuid": 2a4fd4a4-9373-11e6-b1b1-b46d8361714b, type": "image/jpeg", "size": 2200}, "再看下 这个视频", {"uuid": 2a4fd4a4-9373-11e6-b1b1-b46d8361714b, type": "video/avi" "size": 1616515156}]

text类型

text类型是纯文本消息,消息体为一个uhf-8编码的字符串。