自定義頭和protobuf解決沾包問題

2021-10-11 22:54:45 字數 2631 閱讀 6072

最近在研究一款遊戲的原始碼。發現裡面的通訊協議是protobuf定義的,但還是自己定義了協議頭部,類似 head + body。先解析頭部裡所儲存的整個包的資料長度,然後再解析包剩餘的資料,這樣做的目的是為了防止沾包。我在想都用了protobuf了為啥不直接用grpc呢。一時想不出,於是我用golnag + protobuf 做了乙個簡單的client + server

乙個包資料組成:

body:表示protobuf資料。

// msg.proto

syntax = "proto3";

option go_package = ".;gctols";

package gctols;

enum msgid

message asklogin

執行命令,生成 msg.pb.go檔案

}一、golang的net網路庫的使用

二、golang的goroutine

三、golang的channel使用

四、bufio.scan可以很好的分割乙個資料報。

//生成乙個 scanner

scanner := bufio.newscanner(conn)

//自定**包方法

scanner.split(func(data byte, ateof bool) (advance int, token byte, err error) {})

//獲取解析出的body

for bufio.scan

包頭是8位元組,表示body長度的是 head[0:4]。表示指令的是head[4:8], 解析出body如下:

func doserverstuf(conn net.conn)  

fmt.printf("len_data %d; length: %d\n", len(data), length)

if int(length) + 8 <= len(data) }}

return

})for scanner.scan()

fmt.printf("msg.msgid: %d, msg.session: %s\n", msg.msgid, msg.sessionid)

} if err := scanner.err(); err != nil

}}

UITableView自定義區頭

自定義區頭,高度自定義又要隨動,就要實現自定義區頭 的同時,實現自定義區尾,只要設定為零就控制區頭的高度 inte ce anniversaydayviewcontroller property nonatomic,strong uitableview tableview property nona...

自定義SOAP訊息頭

對於webservice呼叫,為了驗證呼叫者的身份,可以自定義乙個soapheader,讓呼叫者將身份資訊放在裡面,然後在服務端檢查,具體方法如下 1 先定義乙個soapheader,用它來傳遞身份資訊 using system using system.web.services.protocols...

FastCGI處理自定義HTTP頭

fcgx中,自定義頭可以獲取環境變數獲得。但是名字前面要加入http 字母全部大寫,例如 自定義頭username,在fastcgi的fcgx中,變為 http username。可以用fcgx getparam獲取單個環境變數。頭資訊在fcgx request envp中,可以全部列印出來 cha...