protocolbuff是Google推出的開源序列化協議,幾乎支持市面上全部主流語言。用做服務器與服務器或者客戶端與服務器的網絡傳輸協議再合適不過了。簡單寫個demo。
項目結構:git
ProtocolBuff ----Makefile ----src ----github.com/golang/protobuf ----main ----protocol
配置協議:
protocol/protocol.protogithub
package protocol; enum ItemType { USERITEM = 1; EQUIPMENT = 2; }; message ItemInfo { optional int32 ID = 1; optional int32 Type = 2; optional string Name = 3; optional int32 Amount = 4; };
執行protoc --go_out=./ protocol.proto自動生成protocol.pb.go,生成目錄爲當前目錄。protoc支持生成多種語言,具體用protoc -h查看。golang
main/main.goshell
package main import ( "github.com/golang/protobuf/proto" "fmt" "protocol" ) func main() { item := protocol.ItemInfo{ ID : proto.Int32(10), Type : proto.Int32(1), Name : proto.String("item_0"), Amount: proto.Int32(99), } data := EncodeMsg(&item)//封包 fmt.Printf("Encode Data %v \n", data) res := DecodeMsg(data)//解包 fmt.Printf("Decode Data %v \n", res.String()) } func EncodeMsg(pb proto.Message) []byte{ data, err := proto.Marshal(pb) if err != nil{ fmt.Errorf("%v \n",err.Error()) } return data } func DecodeMsg(data []byte) (result protocol.ItemInfo){ proto.Unmarshal(data, &result) return }
Makefile服務器
GOPATH := $(shell pwd) all: GOPATH=${GOPATH} go install main
make之後,bin目錄下會生成可執行文件main,執行獲得結果:
Encode Data [8 10 16 1 26 6 105 116 101 109 95 48 32 99]
Decode Data ID:10 Type:1 Name:"item_0" Amount:99網絡