zero是我用Go實(shí)現(xiàn)的一個(gè)非常輕量的Socket服務(wù)器,可用于快速制作游戲Demo撩银,整個(gè)項(xiàng)目不超過(guò)500行代碼给涕。提供心跳檢測(cè),會(huì)話管理功能额获。
接收發(fā)送數(shù)據(jù)使用二進(jìn)制數(shù)據(jù)流的方式够庙,可以非常方便的配合Protobuf使用。
Message消息結(jié)構(gòu)
消息結(jié)構(gòu)定義在message.go
中咪啡,收發(fā)消息的編碼和解碼操作在codec.go
中處理首启。消息結(jié)構(gòu)定義如下:
type Message struct {
msgSize int32 // 消息長(zhǎng)度
msgID int32 // 消息ID
data []byte // 消息數(shù)據(jù)
checksum uint32 // 校驗(yàn)碼 adler32算法
}
Session會(huì)話
每個(gè)連接對(duì)應(yīng)一個(gè)Session對(duì)象,在連接建立的時(shí)候創(chuàng)建撤摸,并在斷開連接的時(shí)候刪除毅桃。
每個(gè)Session保存當(dāng)前的conn
的指針,可以綁定一個(gè)UserID
准夷。
Session還提供一個(gè)key-value map用于保存自定義的信息钥飞。
Connection連接
連接建立時(shí),觸發(fā)連接事件衫嵌。conn.go
實(shí)現(xiàn)了接收和發(fā)送的方法读宙,接收到消息時(shí)使用channel發(fā)送到socketservice,并觸發(fā)onMessage
事件楔绞,所以在處理游戲邏輯的時(shí)候數(shù)據(jù)會(huì)是同步的结闸。
每個(gè)連接在讀取消息時(shí)唇兑,加入超時(shí)檢查來(lái)實(shí)現(xiàn)心跳檢查,如果在設(shè)置的時(shí)間內(nèi)沒(méi)有接收到消息桦锄,則判斷為心跳丟失觸發(fā)斷線事件扎附。
Socket服務(wù)
Socket服務(wù)被我封裝在service.go
內(nèi)。需要注冊(cè)一下事件结耀,分別處理收到消息留夜,連接,斷線:
- RegOnMessageHandler(func(s *zero.Session, msg *zero.Message))
- RegOnConnectHandler(func(s *zero.Session))
- RegOnDisconnectHandler(func(s *zero.Session, err error))
當(dāng)服務(wù)啟動(dòng)時(shí)图甜,啟動(dòng)一個(gè)協(xié)程acceptHandler
監(jiān)聽連接碍粥,直到stopCh接收到數(shù)據(jù)時(shí),停止服務(wù)黑毅。
在建立連接后會(huì)創(chuàng)建一個(gè)新的協(xié)程connectHandler
用于創(chuàng)建conn
對(duì)象和session
對(duì)象嚼摩。
conn
創(chuàng)建后會(huì)啟動(dòng)負(fù)責(zé)接收readCoroutine
和發(fā)送writeCoroutine
的協(xié)程。
session
會(huì)被保存在SocketService.sessions
中進(jìn)行管理博肋。
項(xiàng)目地址:https://github.com/9b9387/zero
UnityDemo
提供一個(gè)Unity實(shí)現(xiàn)的Demo做展示https://github.com/9b9387/zero_unity_demo低斋,用zero做網(wǎng)絡(luò)服務(wù),Unity客戶端實(shí)現(xiàn)與zero配套的網(wǎng)絡(luò)功能匪凡,數(shù)據(jù)格式使用JSON。
Demo實(shí)現(xiàn)的功能:
- 新玩家加入
- 在線玩家同步
- 玩家移動(dòng)位置同步
- 玩家離開
運(yùn)行效果
同步兩個(gè)客戶端的位置
運(yùn)行Demo:
服務(wù)器
cd Server
go get -u github.com/9b9387/zero
go run app.go
客戶端
Demo開發(fā)環(huán)境使用Unity版本2018.3.2f1