.
如何自定義一個協(xié)議
先有一個需求,有個場景,打開外賣軟件,會顯示商家列表,列表中有很多項,每一項都包含了一些信息,商家的名稱,圖片,好評率,距離你的位置,評分
這些信息都是通過網(wǎng)絡(luò),從服務(wù)器獲取的,
客戶端,需要給服務(wù)器發(fā)送一個請求,服務(wù)器收到請求之后,就給客戶端返回一個響應(yīng),這里的請求和響應(yīng)該如何創(chuàng)建呢,格式是怎樣的呢?
我們可以做出如下設(shè)計:
1.明確當前請求和響應(yīng)中包含哪些信息
請求:用戶身份,用戶當前位置
響應(yīng):商家的名稱,圖片,好評率,距離你的位置,評分
2.明確具體的請求和響應(yīng)的格式
示例1:
請求:1234,23 100\n
所謂的明確格式就是看你按照什么樣的方式,構(gòu)造出一個字符串,后續(xù)這個字符串就可以作為udp或者tcp的payload進行傳輸,另一方面,服務(wù)器就可以對這個字符串進行分析,解析出逗號前面是用戶身份,逗號后面是用戶當前位置(經(jīng)緯度)
響應(yīng):
老麻抄手,1.jpg,96%,1.3km,4.6\n
這個時候就構(gòu)造出了一個響應(yīng)這樣的字符串,用戶就可以按照這樣的格式來進行解析了
網(wǎng)絡(luò)上,傳輸?shù)臄?shù)據(jù),本質(zhì)上就是字符串,因為無法直接傳輸傳輸一個java對象這樣的內(nèi)容
java寫代碼,都是使用的各種對象,但是最后在發(fā)送數(shù)據(jù)的時候,就需要把對象轉(zhuǎn)換為二進制的字符串(序列化)
而在接收數(shù)據(jù)的時候,也需要把二進制的字符串轉(zhuǎn)換為對象(反序列化)
實際上,上述這樣的約定,可以隨意構(gòu)造,只要保證,客戶端和服務(wù)器遵守同一個約定即可
示例2:
魚香肉絲;1.jpg;96%;2.6km;4.5!
使用!來分割每個商家,使用;來分割商家的每個信息
通用的協(xié)議格式
雖然說,自定義的協(xié)議格式,是可以任意的,但是為了避免出現(xiàn)過于天馬行空的設(shè)計,大佬們就做出了一些通用的協(xié)議格式,參考這些格式,就可以對咱們的協(xié)議設(shè)計產(chǎn)生重要的指導(dǎo)作用
xml
是以成對的標簽,來表示"鍵值對"信息,同時標簽支持嵌套,就可以構(gòu)成一些更為復(fù)雜的樹形結(jié)構(gòu)數(shù)據(jù)
請求:
< request>
< userId>1234< /useId>
< position>100 80< /position>
< /request>
對象的本質(zhì)上也是鍵值對,屬性的名字就是鍵,屬性的值就是值
html是寫網(wǎng)頁的語言,也是帶有標簽的
xml里的標簽都是程序員自定義的,html里的標簽,都是有一套標準規(guī)定好的
響應(yīng):
< response>
< shops>
< shop>
< name>老麻抄手< /name>
< image>1.jpg< /image>
< distance>1km< /distance>
< rate>96%< /rate>
< star>4.7< /star>
< /shop>
< shop>
< name>魚香肉絲< /name>
< image>1.jpg< /image>
< distance>2km< /distance>
< rate>94%< /rate>
< star>4.6< /star>
< /shop>
< /shops>
< /response>
優(yōu)點:xml非常清晰的把結(jié)構(gòu)化數(shù)據(jù)表示出來了
缺點:表示數(shù)據(jù)需要引入大量的標簽,看起來非常繁瑣,同時也占用了不少的網(wǎng)絡(luò)帶寬
國內(nèi),最貴的硬件資源,就是網(wǎng)絡(luò)帶寬
json
最流行的一種數(shù)據(jù)組織格式
本質(zhì)上也是鍵值對,看起來比xml要干凈不少
請求:
{
useId:1234,
position:“100 80”
}
json中,使用{}表示鍵值對,使用[]表示數(shù)組,數(shù)組里的每個元素,可以是數(shù)字,可以是字符串,也可以是其他的{},[]
響應(yīng):
[
{
name:‘老麻抄手’,
image:‘1.jpg’,
distance:1km,
rate:96%,
star:4.7
},
name:‘魚香肉絲’,
image:‘1.jpg’,
distance:2km,
rate:97%,
star:4.5
]
當前最主流的一種網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)母袷?未來實際開發(fā)中經(jīng)常會用到j(luò)son格式的數(shù)據(jù)
json對于換行并不敏感,如果這些內(nèi)容全部都放在同一行,也是完全合法的
一般網(wǎng)絡(luò)傳輸?shù)臅r候,會對json進行壓縮(去掉不必要的換行和空格),同時把所有的數(shù)據(jù)放到一行去,整體占用的帶寬就更低了,但是會影響到可讀性文章來源:http://www.zghlxwxcb.cn/news/detail-836024.html
protobuffer
谷歌提供的一套,二進制的數(shù)據(jù)序列化方式
使用二進制的方式,約定某幾個字節(jié),表示哪個屬性
最大程度上節(jié)省了空間(不必傳輸key,根據(jù)位置和長度,區(qū)分每個屬性)
優(yōu)點:
節(jié)省帶寬,最大化優(yōu)化效率
缺點:二進制數(shù)據(jù),肉眼無法直接觀察,不方便調(diào)試
使用起來也是比較復(fù)雜的,需要專門編寫一個proto文件,描述數(shù)據(jù)的格式咋寫,proto需要一系列的語法,有點像java/c++又不太一樣,再進一步的通過proto提供的工具,把proto文件轉(zhuǎn)化成一些代碼,再嵌入到程序中使用,這個主要用于對于性能要求更高的場景
對于一個程序來說,開發(fā)效率/運行效率哪個更重要
通常來說,是開發(fā)效率更重要,可以通過提升硬件設(shè)備,來提高運行效率,想要提高開發(fā)效率,就得招聘更多的程序員,成本開銷更大
當然,在類似游戲開發(fā)的場景,就是需要運行效率更高比較重要文章來源地址http://www.zghlxwxcb.cn/news/detail-836024.html
到了這里,關(guān)于如何自定義一個協(xié)議的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!