专栏首页章鱼的慢慢技术路使用Go语言+Protobuf协议完成一个多人聊天室

使用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 条评论
登录 后参与评论

相关文章

  • LeetCode-21.Merge Two Sorted Lists | 合并两个有序链表

    Merge two sorted linked lists and return it as a sorted list. The list should be...

    Zoctopus
  • Go语言实践_实现一(客户端)对一(服务器端)聊天室

    1,首先启动服务器端,使用listen_socket函数监听IP地址上的客户端连接;

    Zoctopus
  • 在场景中加入第一人称视角运行后一直往下掉的解决方案

    Zoctopus
  • Go语言实现TCP服务端和客户端

    TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导...

    ccf19881030
  • 【每日一题】本周合辑

    其实,学习本身是违反天性的。身边很多同学都有“学习焦虑症”,似乎不学习就会被同龄人超越,被时代抛弃,但他们都不愿意经历学习的痛苦,却都想要享受学习的成果。

    疯狂的技术宅
  • RTSP/GB28181/Ehome协议/HIKSDK视频融合共享平台EasyCVR级联到上级国标平台在线状态不更新修复

    支持RTSP、GB28181、SDK、Ehome协议的视频平台EasyCVR支持将所有视频通道通过GB28181协议级联到上级国标平台上,且支持同一通道级联到多...

    EasyNVR
  • 终极解决方案:org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has alr

    org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStr...

    庞小明
  • golang beego orm无限条件查询,多条件查询,不定条件查询,动态多条件查询sql语句,一个字段匹配多值

    其实我的需求就是:一个树状目录,每个目录下都存有成果,给定某一个上级目录id,分页查询出这个目录下以及子孙目录下的所有成果,要求分页。

    hotqin888
  • Spring Boot 2.2.0 发布,性能提升、支持 Java 13

    Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Central 获取。

    芋道源码
  • AngularDart Material Design 应用布局 顶

    应用布局 应用程序布局是一个样式,指令和组件系统,当它们一起使用时,可以提供材质外观和感知应用程序的层叠关系。 它根据材料规格提供应用栏,抽屉和导航样式。

    南郭先生

扫码关注云+社区

领取腾讯云代金券