Golang 从零开始实现多人聊天室(三)上线通知与公屏聊天

系列文章目录

跟着😽猫猫学Golang,快人一步
系列初开,跟着我走进Go 语言的世界里🌍

系列目录
Golang 从零开始实现多人聊天室(一)服务端监听
Golang 从零开始实现多人聊天室(二)客户端访问


文章目录

  • 系列文章目录
  • 😺前言
  • 项目代码持续更新
  • 一、服务端 client
    • 1.接收的消息转发至其他客户端
    • 2.通知其他人上线
    • 3.通知上线新Op
  • 二、客户端 client
    • 1.接收服务端的通知消息
    • 2.发送登录消息
    • 3.公屏聊天
  • 😽总结


😺前言

运用 go 里面的net包中的相关方法来实现一个基于tcp的简单多人聊天室
实现

  • 加入聊天室
  • 广播通知
  • 公屏聊天
  • 群聊
  • 单聊
  • 退出

建立文件目录进行服务端与客户端区分
服务端代码就写在server 文件夹下的 server 文件中
客户端代码就写在cliemt 文件夹下的 client文件中
在这里插入图片描述

项目代码持续更新

多人聊天室
https://github.com/moercat/go-chatroom

此时更新到服务端转发


一、服务端 client

1.接收的消息转发至其他客户端

修改 Read,即当服务端接收到消息时,通过接受链接的客户端信息映射 ConnMap来转发给每一个客户端,从而实现通信

func (m Message) Read() {// 统一消息格式fmt.Printf("%v 用户[%s]: %v \n", time.Now().Format("2006-01-02 15:04:05"), m.Name, m.Msg)for _, client := range ConnMap {msg := fmt.Sprintf("%v [%s]: %v", time.Now().Format("2006-01-02 15:04:05"), m.Name, m.Msg)_, err := client.Conn.Write([]byte(msg))if err != nil {fmt.Println("client Conn Error")return}}}

2.通知其他人上线

通过上文实现了服务端的广播通信,那么也就可以实现通知功能,来优化用户体验?
答案肯定是可以的,那么如何做呢,和广播通知同理,通过消息映射找出每一个客户端后转发

// 提醒所有人新用户上线
func (m Message) ntyLogin() {for _, client := range ConnMap {msg := fmt.Sprintf("%v [%s]: %v", time.Now().Format("2006-01-02 15:04:05"), m.Name, "I Login")_, err := client.Conn.Write([]byte(msg))if err != nil {fmt.Println("new user Conn Error")continue}}
}

3.通知上线新Op

不断接收用户输入结果,得到用户的昵称、操作 Op 后可以正式进行我们的通信操作,定义一个 msg 的 Say 函数专门处理发送至服务端的信息

const (Read = iota + 1QuitNtyLogin // 通知上线的Op
)

改进服务端Op表

	switch cMsg.Op {case Read:cMsg.Read()case Quit:case NtyLogin:cMsg.ntyLogin()default:fmt.Println("无效OP")}

此时当我们接收到 Op 为2的操作时,将会对所有成员通知该用户此时上线

二、客户端 client

1.接收服务端的通知消息

每一个客户端单独开一个协程进行接收消息,与发送分离,防止发送消息
因为接收导致阻塞

	go baseMsg.Receive(conn)
func (m Message) Receive(conn net.Conn) {for {data := make([]byte, 255)ml, err := conn.Read(data)if ml == 0 || err != nil {// 收到的参数错误忽略、continue}fmt.Println(string(data[:ml]))}
}

2.发送登录消息

通过之前我们了解到 Op 的含义,那么服务端我们也需要维护一份Op表,那么 Login 我们定义为 2

const (Say = iota + 1QuitLogin
)

那么我们也不允许用户可以通过发送登录信息来不同的广播自己的登录信息

		switch msg.Op {case Say:msg.Say(conn)case Quit:msg.Quit(conn)case Login:fmt.Println("您已登录,输入无效,请重新输入")default:fmt.Println("输入无效op,请重新输入")}

通过约定好的协议模型,来当调用时进行单次的登录信息广播

func (m Message) Login(conn net.Conn) {msg := m.Name + "|" + strconv.Itoa(Login) + "|"_, err := conn.Write([]byte(msg))if err != nil {fmt.Println("通知服务端登录信息发送失败")return}
}

当我们登陆时,我们可以知道我们
在这里插入图片描述

3.公屏聊天

由于服务端实现了转发,也就是每一个客户端的信息都会被服务端广播给同个服务器的所有人,那么此时我们也就达到了公屏聊天的需求

在这里插入图片描述

😽总结

🎶感谢您看到这里🎶

从零开始实现一个基于Go的多人在线聊天室,功能包括:单聊、群聊、昵称、上下线通知、聊天日志等等,
通过服务端的转发,我们可以收到了其他客户端的消息,这牌篇博文也就达成了我们所需要的上线通知与公屏聊天,那么下篇博文将会重点在退出与重新登陆,将会通过代码简单的实现消息记录的存储,将每个人尽量保留聊天记录。多人在线聊天室只是一个简单的使用场景,那么不断地为自己提需求就是学习的动力。

希望这个博客能对你有所益处。我是轻王,我为自己代言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商务人士邮箱推荐?高大上邮箱来了!

既然点进文章那不用多说,大家肯定都是商务人士。在普通人眼里商务人士就等于精英人士,他们的行头都是一身西装梳着根根分明的大背头,他们会多国语言精通各种数字,总之就是看起来很厉害每天很精致。那商务人士到底是不是这样呢我也…

商务人士适合用什么邮箱?一款商务人士必备的邮箱推荐

在商务及办公场合中,电子邮箱的使用越加频繁,对于邮箱的选择安全及易用性成为了重中之重。 如果你是金融、互联网、法律、机关单位等领域的商务人士,或者你需要将邮箱作为对外的入口,对你而言,一个可靠的付费邮箱是非…

国内好用的邮箱评选,电子邮箱大全有你的吗?

国内邮箱、好用的邮箱、电子邮箱大全、163邮箱、TOM邮箱、邮箱品牌 早在三国时期,一种说法便流传至今,这酒是“三分天下”,最早是指三国时期魏、蜀、吴三国鼎立并且互相牵制的局面。在现代,也常常引用“三分天下”来形容某市场或…

你知道大量群发邮件用什么邮箱好吗?

随着社会的发展,我们的销售模式也在发生这巨大的变化,在之前我们的销售模式主要靠在线下的各种人的走街串巷的来进行营销,但是随着我们科技的进步,互联网也成为了我们生活中密不可分的一部分,在这时候一种全新的营销模…

堪称最佳邮箱Gmail邮箱的神奇的一号多名功能

QQ邮箱支持添加一个英文用户名的foxmail邮箱,已经比很多邮箱好用,但是gmail邮箱的一号多名的功能更为神奇,一个邮箱账号可以变成无数个邮箱,对于需要很多邮箱账号的情形,比如注册网络小号,非常有用&#xf…

推荐国内外,安全好用的电子邮箱

众多邮箱品牌,人们熟悉QQ、网易、新浪,较之而言,TOM邮箱更具安全性、实用性。小编整理分析详情如下。 性价比高、功能实用:TOM含免费邮箱,又相继推出了极致邮、畅享邮,后两款为VIP付费邮箱,容量…

最近沉迷美女图片无法自拔,所以我决定用PHP扒海量妹子图

为什么80%的码农都做不了架构师?>>> 学习PHPMySQL制作WEB应用有一阵子了,没有上过学所以只能学习到CURD的地步。 最近对国产美女图片、私房写真特别感兴趣,什么周妍希、刘飞儿、李可可、推女郎我一个都不知道~~ 经常调查我发现一…

TA(技术美术)宝藏网站

TA(技术美术)宝藏网站 我们不生产TA我们只是TA的搬运工(感谢马甲大佬总结!?)T部分(技术相关)1.Shadertoy2.GLSL SandboX3.candycat的博客4.关于raymarching5.minionsart大神6.冯委大…

杜凯杰教学数据分析:python 图片爬取 爬取各校校花图片

python 图片爬取 爬取各校校花图片 —杜凯杰 爬取十页校花图片(可按需求更改页数,爬取更多图片)—杜凯杰 import requests from lxml import etree startUrlhttp://www.xiaohuar.com/list-1- headers{User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleW…

chatgpt赋能python:Python如何操作Word文档

Python如何操作Word文档 简介 Python是一种高级编程语言,具有易于学习和使用、高效、可移植性强等优点。相信许多Python开发者都遇到过需要使用Python操作Word文档的情况。本文旨在介绍如何使用Python操作Word文档,使开发者能够方便地实现自己的需求。…

Word2vec工作原理

文章目录 前言Word2Vec的工作原理CBOWSkip-Gram 参考文献点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 前言 随着计算机应用领域的不断扩大,自然语言处理受到了人们的高度重视。尤其是最近出现的chatgpt&#xff0…

GPT-3 vs Bert vs GloVe vs Word2vec 文本嵌入技术的性能对比测试

来源:DeepHub IMBA 本文约3000字,建议阅读6分钟 随着NLP(自然语言处理)的最新进展,OpenAI的GPT-3已经成为市场上最强大的语言模型之一。 2022年1月25日,OpenAI公布了一个embedding endpoint(Neelakantan et al., 2022)…

人大李崇轩:我的生成模型修炼之路丨智源大会嘉宾风采

导读 AIGC的飞速发展离不开生成模型、深度学习以及多模态学习等领域研究的不断累积,其中生成模型的原理与算法发展是不可或缺的一部分,如:生成对抗网络 GAN 及其一系列变体、变分自编码器 VAE 及其一系列变体、自回归模型 AR、流模型 FLOW &a…

一篇文章教会你用Python抓取抖音app热点数据

今天给大家分享一篇简单的安卓app数据分析及抓取方法。以抖音为例,我们想要抓取抖音的热点榜数据。 要知道,这个数据是没有网页版的,只能从手机端下手。 首先我们要安装charles抓包APP数据,它是一款收费的抓包修改工具&#xf…

22.网络爬虫—APP数据抓取详讲

网络爬虫—APP数据抓取详讲 Fiddler工作原理安装完成Fiddler后的配置前提条件工具配置 手机数据抓取Fiddler手机端配置手机端操作 实战演示后记 前言: 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新…

29 - Excel 图表与数据分析

Day 29 一、Excel的图表 1.图表的作用 数据图表可直观展示统计信息属性(时间性、数量性等),对知识挖掘和信息直观生动感受起关键作用的图形结构,是一种很好的将对象属性数据直观、形象地"可视化"的手段。 数据图表可…

48种数据分析可视化图表

可视化对于数据分析师来说可能不是最重要的,重要的是你分析或挖掘出来的结果是否有效。在这基础之上就需要通过可视化恰当完整的表达见解。这里又有区别了:实用性和美观性哪个更重要?要我说实用性是第一位的,能用一个元素表达最好…

我们做了一款AI口语外教,寻找测试用户

因为自己学雅思,做了一个AI口语外教,用来练习口语 有两种模式:1.自由对话2.雅思练习与模拟考试 优点如下:1.语音合成真实,聊起来有趣2.参考提示,解决你不会的问题3.雅思模式严格按照话题进行,…

使用new bing来阅读文献

1.下载安装Microsoft Edge Dev版本 Microsoft Edge 预览体验成员 (microsoftedgeinsider.com) 2.打开设置中的discover 3.打开必应 (bing.com) 改地区为美国,账号新建时地区也要改为美国 节点也需要改为美国 4.使用聊天机器人来问一些学术问题 5.打开pdf&…

VueHub:我用 ChatGPT 开发的第一个项目,送给所有 Vue 爱好者

大家好,我是DOM哥。 我用 ChatGPT 开发了一个 Vue 的资源导航网站。 不管你是资深 Vue 用户,还是刚入门想学习 Vue 的小白,这个网站都能帮助到你。 网站地址:VueHub 纯净模式:VueHub 项目托管在 GitHub&#xff0c…