zero——Go實(shí)現(xiàn)輕量級(jí)的Tcp服務(wù)器

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è)客戶端的位置


demo.gif

運(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掘猿,一起剝皮案震驚了整個(gè)濱河市病游,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稠通,老刑警劉巖衬衬,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異改橘,居然都是意外死亡滋尉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門飞主,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狮惜,“玉大人,你說(shuō)我怎么就攤上這事碌识∧氪郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵筏餐,是天一觀的道長(zhǎng)开泽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)魁瞪,這世上最難降的妖魔是什么穆律? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任惠呼,我火速辦了婚禮,結(jié)果婚禮上峦耘,老公的妹妹穿的比我還像新娘剔蹋。我一直安慰自己,他們只是感情好贡歧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布滩租。 她就那樣靜靜地躺著,像睡著了一般利朵。 火紅的嫁衣襯著肌膚如雪律想。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天绍弟,我揣著相機(jī)與錄音技即,去河邊找鬼。 笑死樟遣,一個(gè)胖子當(dāng)著我的面吹牛而叼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豹悬,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼葵陵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瞻佛?” 一聲冷哼從身側(cè)響起脱篙,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伤柄,沒(méi)想到半個(gè)月后绊困,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡适刀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年秤朗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔喉。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡取视,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出然遏,到底是詐尸還是另有隱情贫途,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布待侵,位于F島的核電站丢早,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怨酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一傀缩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧农猬,春花似錦赡艰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至揍堕,卻和暖如春料身,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衩茸。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工芹血, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楞慈。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓幔烛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親囊蓝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饿悬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 嗨,大家好! 我的名字是Sergey Kamardin聚霜,我是Mail.Ru的工程師乡恕。 介紹 首先介紹我們的故事的上...
    肆虐的悲傷閱讀 2,723評(píng)論 1 11
  • 本文包括udp客戶端、udp服務(wù)器俯萎、tcp客戶端、tcp服務(wù)器运杭、http客戶端夫啊、http服務(wù)器 net包提供了可移...
    遇見你_17be閱讀 663評(píng)論 0 1
  • 短信驗(yàn)證碼工作原理: 注冊(cè)填手機(jī)號(hào),點(diǎn)擊獲取按鈕,手機(jī)App觸發(fā)短信驗(yàn)證碼下發(fā)指令,將用戶的手機(jī)號(hào)碼和驗(yàn)證碼內(nèi)容通...
    rebeccaBull閱讀 351評(píng)論 0 0
  • 1.事件:約好今天上午10:30媽看牙,杭發(fā)燒急著看病辆憔,聯(lián)系兒童醫(yī)院撇眯,早上七點(diǎn)半就從家里出發(fā),辦好住院手續(xù)找好大夫...
    快樂(lè)當(dāng)下閱讀 85評(píng)論 0 0
  • 年底討債那些事(三) 非法拘禁型 案情回顧: 2012年3月虱咧,河北省黃驊市市民段志飛(化名)來(lái)到江蘇熊榛,以500萬(wàn)元...
    daring婧閱讀 113評(píng)論 0 0