上篇sibo協議的定製裡其header部分包含了序列化型別及壓縮型別的定義。
由於序列化為占用3個bit,因此最多可支援8種序列化方式。同理,壓縮型別最多支援4種。
sibo協議定義支援的序列化型別如下(共5種):
const (
serializenone serializetype = iota // 原始二進位制
json
protobuffer //protobuf
msgpack
bson
)
接下來我們來實現這5中序列化方式:
1)通用呼叫介面
type
codec inte***ce )(byte, error)
decode(data byte, i inte***ce{}) error
}
2)原始二進位制編譯碼
// bytecodec uses original bytes.
// 原始二進位制編譯碼
type bytecodec struct {}
func (c bytecodec) encode(i inte***ce{}) (byte, error)
return
nil, fmt.errorf("%t is not a byte", i)
}func (c bytecodec) decode(data byte, i inte***ce{}) error
reflect.valueof(i).setbytes(data)
return
nil}
3)json編譯碼
// jsoncodec uses json marshaler and unmarshaler.
// json編譯碼
type jsoncodec struct{}
func (c jsoncodec) encode(i inte***ce{}) (byte, error)
func (c jsoncodec) decode(data byte, i inte***ce{}) error
4)protobuf編譯碼
// protobuf編譯碼
type pbcodec struct{}
// encode encodes an object into slice of bytes.
func (c pbcodec) encode(i inte***ce{}) (byte, error)
if m, ok := i.(pb.message); ok
return
nil, fmt.errorf("%t is not a proto.marshaler", i)
}// decode decodes an object from slice of bytes.
func (c pbcodec) decode(data byte, i inte***ce{}) error
if m, ok := i.(pb.message); ok
return fmt.errorf("%t is not a proto.unmarshaler", i)
}5)msgpack編譯碼
// msgpack編譯碼
type msgpackcodec struct{}
// encode encodes an object into slice of bytes.
func (c msgpackcodec) encode(i inte***ce{}) (byte, error)
// decode decodes an object from slice of bytes.
func (c msgpackcodec) decode(data byte, i inte***ce{}) error6)bson編譯碼
// use "gopkg.in/mgo.v2/bson"
// bsoncodec uses bson marshaler and unmarshaler.
// bson編譯碼
type bsoncodec struct{}
// encode encodes an object into slice of bytes.
func (c bsoncodec) encode(i inte***ce{}) (byte, error)
// decode decodes an object from slice of bytes.
func (c bsoncodec) decode(data byte, i inte***ce{}) error
sibo協議定義支援解壓縮型別如下(共2種):
const (
// none does not compress
none compresstype = iota
// gzip uses gzip compression
gzip
zlib
)
具體試下如下:
1)通用呼叫介面
type compressor inte***ce
2)預設實現(無壓縮)
type none struct {}
func (n none) decompress(data byte) (byte, error)
func (n none) compress(data byte) (byte, error)
3)gzip壓縮
type gzip struct{}
// unzip unzips data.
func (g gzip) decompress(data byte) (byte, error)
defer gr.close()
data, err = ioutil.readall(gr)
if err != nil
return data, err
}// zip zips data.
func (g gzip) compress(data byte) (byte, error)
err = w.flush()
if err != nil
err = w.close()
if err != nil
return buf.bytes(), nil
}
4)zip壓縮
type zip struct{}
// unzip unzips data.
func (z zip) decompress(data byte) (byte, error)
defer zr.close()
data, err = ioutil.readall(zr)
if err != nil
return data, err
}// zip zips data.
func (z zip) compress(data byte) (byte, error)
err = w.flush()
if err != nil
err = w.close()
if err != nil
return buf.bytes(), nil
}
mysql 做遊戲伺服器配置 遊戲伺服器部署
bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...
mysql遊戲伺服器快取 遊戲伺服器快取策略
1 什麼是快取 在資料庫與伺服器邏輯之間加入的資料層 2 作用 減少資料庫操作 伺服器使用mysql作為資料庫,mysql每秒鐘併發數量有限,所以我們要減少mysql的操作。3 erlang的快取 erlang 在記憶體中可用 程序字典 gen state ets 儲存變數,理論上三種方式都可以作為...
遊戲伺服器架構
登陸伺服器判斷賬戶合法性,如果合法的話,把session資訊寫入memcache,閘道器伺服器收到玩家連線請求後,在memcache裡查詢是否合法玩家,防止非法連線。閘道器伺服器要管理玩家連線,需要高併發,可以開多個 scene mgr純粹的 訊息功能 資料庫伺服器純粹的查詢修改資料功能,如果成為瓶...