日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Go语言+Protobuf协议完成一个多人聊天室

發(fā)布時間:2024/4/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Go语言+Protobuf协议完成一个多人聊天室 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

軟件環(huán)境:Goland?

Github地址

一、目的

之前用純邏輯壘完了一個可登入登出的在線多人聊天室(代碼倉庫地址),這次學(xué)習(xí)了Protobuf協(xié)議,于是想試著更新下聊天室的版本。

主要目的是為了掌握Protobuf的使用。

?

二、設(shè)計思路

通過Protobuf中內(nèi)置好的編碼函數(shù),將要發(fā)送的數(shù)據(jù)進行編碼,之后在“編碼后的”數(shù)據(jù)前加入?yún)f(xié)議號和報頭,再轉(zhuǎn)碼通過Write與Read函數(shù)進行數(shù)據(jù)的發(fā)送和接收。

1,先寫好服務(wù)端中的監(jiān)聽(Listen)端口函數(shù)與客戶端上的網(wǎng)絡(luò)撥號(Dial)函數(shù);

2,客戶端,對數(shù)據(jù)進行解碼;

//客戶端,對接收到的數(shù)據(jù)進行解碼newTest := &protocol.Conn_ToS{}err = proto.Unmarshal(msgdata[0:msgdata_read],newTest)if err != nil{log.Fatal("unmarshaling error:",err)}fmt.Println(newTest.GetNickname(),newTest.GetMsg())

  

3,服務(wù)端,接收消息;

//服務(wù)端,接收到信息并遍歷Map發(fā)送消息datamsg := make([]byte,255)datamsg_read ,err := conn.Read(datamsg)if datamsg_read == 0 || err != nil{continue}fmt.Println(datamsg[0:datamsg_read])for _,v := range ConnMap{v.Write(datamsg[0:datamsg_read])}

?

三、注意點

1,注意字節(jié)處的拼接,建議使用append函數(shù)

2,處理連接處注意對數(shù)據(jù)編碼解碼的處理

3,設(shè)置Map存所有連服務(wù)端的客戶端連接,并到需要時遍歷輸出和轉(zhuǎn)發(fā)消息至Map中所有的連接;

?

四、效果

Server端

?

Client1端

?

?

Client2端

?

?

Client3端

?

?

總結(jié)

以上是生活随笔為你收集整理的使用Go语言+Protobuf协议完成一个多人聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。