最近在研究一款遊戲的原始碼。發現裡面的通訊協議是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...