这篇文章是是网络程序的完结篇。通过上述两篇文章的讲解,相信没接触过网络程序的同僚,大概知道如何编写网络程序了,也基本上知道协议是怎么回事了吧。这篇文章就是讲解一下如何设计协议指令,让服务器和客户端能够有效的“交流”。
首先,给大家说明一下,协议和指令是两个什么东西?这两个看似两个东西,其实是一个东西,通俗的讲就是数据结构,尤其是初学网络程序的同僚很容易弄模糊。我记得我最开始接触协议的概念是在大学时,当时正在学UDP协议,TCP协议,我以为协议就是这么些东西,直到到我到第一家公司实习,我才算对协议有了更深的认识,才知道协议就是一种数据结构。然而,之后我跳槽去了另外一家公司,接触了指令的概念,起初我以为指令和协议是两个东西,后来和公司老同事了解,指令其实也是一种数据结构,只是叫法不一样。经过这两家公司的实践之后,我才算真正意义上的理解了协议。我相信有很多同僚会和我进入一个误区,会把重心放在名称上,其实我们关注的只是服务器和客户端的交互结构(即数据结构),因为每个公司、每个程序员都有不同的叫法(例如协议,指令等,目前本人只听说了这两种叫法,可能还有别的)。所以希望初学的同僚莫要踏入误区,这样能节省不少时间。
在我们知道什么是协议之后,那么如何设计出好的数据结构呢?我将通过本人分别在两家公司接触的交互模式进行说明。一种是请求问答模式,另一种是独立模式。这两种模式的叫法都是非专业术语,只是我觉得这样叫好理解而已。
请求问答模式?
就是客户端主动向服务器发送一次数据,就会收到一次服务器的数据,就是一问一答的形式。就像HTTP协议的请求问答模式,懂HTTP协议原理的同僚应该知道。下面我例举两条协议:
//客户端向服务器主动发送的数据
{
“typeId”:0x0003,
“userId”:”00000000-0000-0000-0000-000000000000”,
“contactId”:”00000000”,
“fileType”:0,
“reserve”:”this is added value”
}
//服务器收到客户端的数据之后回复给客户端的数据
{
“typeId”:0x0003,
“userId”:”00000000-0000-0000-0000-000000000000”,
“contactId”:”00000000”,
“msgType”:0,
“fileAddr”:”this is url”,
“reserve”:”this is added value”
}
上述中的字段属性不用全部知道,只需要知道typeId字段即可。客户端主动向服务端请求的协议和服务端被动回复给客户端的typeId字段值是一样的,每条客户端主动向服务端请求的数据协议都会有对应的回复,这就是所谓的请求问答模式。但是这种模式设计可能会导致数据冗余,这里不做讲解,我在之前的文章中说过(《协议指令设计模式心得》)。
独立模式?
不像请求问答模式,在这种模式下,客户端向服务器发送数据不一定有回复,即使有回复typeId也是不同的。这种设计模式,可以让服务器主动给客户端推送数据,所以客户端和服务端都可以是主动方或者被动方。下面也是例举两条协议:
//客户端向服务器发送的数据
{
“typeId”:0x1002,
“countId”:0,
“userId”:”00000000-0000-0000-0000-000000000000”,
“password”:”xxxxxxxx”,
“loginType”:”visitor”,
“loginParam”:{
“thirdAccount”:”1292218249”,
“thirdHeader”:”url”,
“thirdName”:”this is name”
}
}
//服务器向客户端发送的数据
{
“typeId”:0x2002,
“countId”:0,
“loginType”:”visitor”,
“loginParam”:{
“thirdAccount”:”1292218249”,
“thirdHeader”:”url”,
“thirdName”:”this is name”
},
“error”:0,
“result”:1
}
上述中的字段属性不用全部知道,只需要知道typeId字段即可。客户端主动向服务端请求的协议和服务端被动回复给客户端的typeId字段值是不同的,每条客户端主动向服务端请求的数据协议可能有回复也可能没有回复,这就是所谓的独立模式。
如上所述的两种模式中的协议例子是json数据结构,文本协议形式。什么是文本协议呢?就是我们是以字符串的形式操作,不是逐字节解析的,当然底层都是逐字节解析的,我只是说应用层操作都是以字符串进行操作的。其实还有另外一种协议形式,在应用层面上是逐字节解析,我这里叫做二进制协议。下面给出例举一条协议:
上面就是协议字段字节占用情况,这里无需关注字段作用,主要是给同僚说明一下二进制协议的情况。二进制协议一般用于文件传输上,因为文件内容是二进制数据(有些字符是不可见的),所以这里文本协议是没法处理的。就像HTTP协议中的trunk模式(不知道的去科普,这里不做说明)。
到这里,网络程序篇章已经完结。结合前两篇文章以及这篇文章,一共三篇,分别对建立链接,使用应用层协议以及设计协议模式都做基本讲解,相信各位初学的同僚以及基本掌握。最后附上协议模式范例文档。
链接:https://pan.baidu.com/s/1vJ7FjAEbNuMLrOYFr_vJnQ
提取码:cnhx