軟體環境:Goland 倉庫地址 一、目的 之前用純邏輯壘完了一個可登入登出的線上多人聊天室(代碼倉庫地址),這次學習了Protobuf協議,於是想試著更新下聊天室的版本。 主要目的是為了掌握Protobuf的使用。 二、設計思路 通過Protobuf中內置好的編碼函數,將要發送的數據進行編碼,之後 ...
軟體環境:Goland
一、目的
之前用純邏輯壘完了一個可登入登出的線上多人聊天室(代碼倉庫地址),這次學習了Protobuf協議,於是想試著更新下聊天室的版本。
主要目的是為了掌握Protobuf的使用。
二、設計思路
通過Protobuf中內置好的編碼函數,將要發送的數據進行編碼,之後在“編碼後的”數據前加入協議號和報頭,再轉碼通過Write與Read函數進行數據的發送和接收。
1,先寫好服務端中的監聽(Listen)埠函數與客戶端上的網路撥號(Dial)函數;
2,客戶端,對數據進行解碼;
//客戶端,對接收到的數據進行解碼 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,服務端,接收消息;
//服務端,接收到信息並遍歷Map發送消息 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,註意位元組處的拼接,建議使用append函數;
2,處理連接處註意對數據編碼解碼的處理;
3,設置Map存所有連服務端的客戶端連接,併到需要時遍歷輸出和轉發消息至Map中所有的連接;
四、效果
Server端
Client1端
Client2端
Client3端