使用Go语言+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端

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏圣杰的专栏

事件总线知多少(2)

源码路径:Github-EventBus 事件总线知多少(1) 事件总线知多少(2) 1.引言 之前的一篇文章事件总线知多少(1),介绍了什么是事件总线...

2307
来自专栏小樱的经验随笔

浅析data:image/png;base64的应用

4162
来自专栏计算机编程

关于RxJS 自定义封装Rxbus的使用规范文档

2.3、声明isInner为true的情况: 主要是在push页面之前,即进入子页面:

1752
来自专栏落影的专栏

编译与链接过程的思考

前言 最近遇到一个错误,如下 ? 在解决过程中,回顾了很多知识,于是有了这篇文章。 关键词:预处理、编译、汇编、链接、动态链接库、静态链接库、真机调...

4929
来自专栏菩提树下的杨过

ASP.Net MVC框架配置与分析

前几年的时候ASP.Net就有MVC的概念,实际上就是我们熟悉的WebForm开发模型。 1、Model层与视图无关,并且只与数据库相关: 伪代码: puli...

19010
来自专栏沃趣科技

看各路神仙如何大战MySQL insecure warning报警有感

一、问题由来 mysql在5.6.5上开始在命令行中直接填入用户密码会提示错误,例如: $./mysql -h10.10.30.18 -uwoqutech -p...

4358
来自专栏极客慕白的成长之路

光棍节程序员闯关秀过关攻略

查看源代码,发现a标签的颜色和背景色一样,导致了我们看不到a过关地址,方法很简单,直接复制源代码中的key即可,或者ctrl+a然后单击进入下一关即可

1125
来自专栏攻城狮的动态

iOS面试题梳理(三)

3637
来自专栏FreeBuf

AutoIt木马又一发:暗藏神秘照片

AutoIt是一个自动化的Windows界面交互的脚本语言,具有很高的灵活性和较低的学习曲线。由于AutoIt解释器本身属于合法程序,黑客可以把恶意代码藏在脚本...

2929
来自专栏前端知识分享

第109天:Ajax请求GET和POST的区别

  用get方式可传送简单数据,但大小一般限制在1KB下,数据追加到url中发送(http的header传送),也就是说,浏览器将各个表单字段元素及其数据按照U...

1212

扫码关注云+社区