go聊天系统项目6-服务端发送消息

一、前言

敬告:本文不讲解代码,只是把代码展示出来。
该代码之前的代码见
go 聊天系统项目-1
go聊天系统项目-2 redis 验证用户id和密码
go聊天系统项目-3 redis注册用户
go聊天项目4-显示用户列表
go 聊天系统项目-5 客户端发消息
注意:本文使用 go mod 管理代码。详情见 go 包相关知识

修改和增加代码

server processor 模块 processor.go

func (this *Processor) serverProcessMes(mes *message.Message) (err error) {
......case message.RegisterMesType://处理注册up := &process2.UserProcess{Conn: this.Conn,}err = up.ServerProcessRegister(mes)
case message.SmsMesType://创建一个SmsProcess实例完成转发群聊消息smsProcess := &process2.SmsProcess{}smsProcess.SendGroupMes(mes)

server process2 包 smsProcess.go 文件

package process2import ("encoding/json""fmt""net""redis/day8/chatroom/common/message""redis/day8/chatroom/server/utils"
)type SmsProcess struct {
}func (this *SmsProcess) SendGroupMes(mes *message.Message) {//遍历服务器端的onlineUsers map[int]*UserProcess//将消息转发取出//取出mes的内容SmsMesvar smsMes message.SmsMeserr := json.Unmarshal([]byte(mes.Data), &smsMes)if err != nil {fmt.Println("json.Unmarshal err=", err)return}data, err := json.Marshal(mes)if err != nil {fmt.Println("json.Marshal err=", err)return}for id, up := range userMgr.onlineUsers {//这里,还需要过滤掉自己,即不要发送给自己if id == smsMes.UserId {continue}this.SendMesToEachOnlineUser(data, up.Conn)}}func (this *SmsProcess) SendMesToEachOnlineUser(data []byte, conn net.Conn) {//创建一个Transfer 实例,发送datetf := &utils.Transfer{Conn: conn, //}err := tf.WritePkg(data)if err != nil {fmt.Println("转发消息失败 err=", err)}
}

client process 模块 smsMes.go 文件

package processimport ("encoding/json""fmt""redis/day8/chatroom/common/message"
)func outputGroupMes(mes *message.Message) {//显示即可//1. 反序列化mes.Datavar smsMes message.SmsMeserr := json.Unmarshal([]byte(mes.Data), &smsMes)if err != nil {fmt.Println("json.Unmarshal err=", err.Error())return}//显示info := fmt.Sprintf("用户id:\t%d 对大家说:\t%s", smsMes.UserId, smsMes.Content)fmt.Println(info)
}

client process 模块 server.go 文件

在代码

func serverProcessMes(conn net.Conn) {
...case message.NotifyUserStatusMesType: //有人上线了//1.取出 NotifyUserStatusMesvar notifyUserStatusMes message.NotifyUserStatusMesjson.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)//2.把这个用户的信息,状态保存到客户 mqp[int]User 中updateUserStatus(&notifyUserStatusMes)//处理

下增加如下代码

case message.SmsMesType: //有人群发消息outputGroupMes(&mes)

编译

cd /Users/zld/Go-project/src
go build -o main main.go
go build -o client day8/chatroom/client/main/main.go

群发消息测试

服务端

./main 
服务器[新的结构]8889 端口监听......
等待客户端连接服务器......
等待客户端连接服务器......
mes= &{LoginMes {"UserId":100,"UserPwd":"123456","UserName":""}}
&{100 123456 tom 0 } 登录成功
等待客户端连接服务器......
mes= &{LoginMes {"UserId":200,"UserPwd":"123456","UserName":""}}
&{200 123456 jack 0 } 登录成功
等待客户端连接服务器......
mes= &{LoginMes {"UserId":300,"UserPwd":"123456","UserName":""}}
&{300 123456 scott 0 } 登录成功

客户端1

./client 
---------------欢迎登录多人聊天系统-------------------1、登录聊天室2、注册用户3、退出系统请选择(1-3):
1
登录聊天室
请输入用户的id
100
请输入用户密码
123456
客户端,发送消息的长度=86,消息内容为: {"Type":"LoginMes","Data":"{\"UserId\":100,\"UserPwd\":\"123456\",\"UserName\":\"\"}"}
当前在线用户列表如下:----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------
客户端%s正在等待读取服务器发送的消息
用户id:  200
客户端%s正在等待读取服务器发送的消息
用户id:  200
用户id:  300
客户端%s正在等待读取服务器发送的消息

客户端2

./client 
---------------欢迎登录多人聊天系统-------------------1、登录聊天室2、注册用户3、退出系统请选择(1-3):
1
登录聊天室
请输入用户的id
200
请输入用户密码
123456
客户端,发送消息的长度=86,消息内容为: {"Type":"LoginMes","Data":"{\"UserId\":200,\"UserPwd\":\"123456\",\"UserName\":\"\"}"}
当前在线用户列表如下:
用户id:  100----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------
客户端%s正在等待读取服务器发送的消息
用户id:  300
用户id:  100
客户端%s正在等待读取服务器发送的消息

客户端3

./client 
---------------欢迎登录多人聊天系统-------------------1、登录聊天室2、注册用户3、退出系统请选择(1-3):
1
登录聊天室
请输入用户的id
300
请输入用户密码
123456
客户端,发送消息的长度=86,消息内容为: {"Type":"LoginMes","Data":"{\"UserId\":300,\"UserPwd\":\"123456\",\"UserName\":\"\"}"}
当前在线用户列表如下:
用户id:  200
用户id:  100----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------
客户端%s正在等待读取服务器发送的消息

客户端3群发消息

2
请输入你想对大家说点什么:
hello
----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------

服务端
mes= &{SmsMes {“Content”:“hello”,“userId”:300,“userPwd”:“”,“userName”:“”,“userStatus”:0,“sex”:“”}}
客户端1

用户id: 300 对大家说:   hello
客户端%s正在等待读取服务器发送的消息

客户端2

用户id: 300 对大家说:   hello
客户端%s正在等待读取服务器发送的消息

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

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

相关文章

【深度学习-论文】通俗易懂的理解多标签识别

文章目录 1. 文章主要内容2. 通俗易懂的理解多标签分类到底是如何实现的通俗易懂的多标签分类实现介绍实现步骤为什么这么做?小结论文题目:Rada r emitter multi-la bel recognition based on residual network 基于残差网络的雷达发射机多标签识别1. 文章主要内容 《基于残…

day5,数据结构,单向,双向,循环链表

1】思维导图 2】完成单向循环链表的所有操作 【创建、判空、尾插、遍历、尾删、销毁】 创建: LooplinkPtr caerte() {LooplinkPtr h(LooplinkPtr)malloc(sizeof(Looplink));if(NULLh){printf("创建失败\n");return NULL;}h->len0;h->data0;h->…

CH340系列芯片驱动电路·CH340系列芯片驱动!!!

目录 CH340基础知识 CH340常见类型 CH340引脚功能讲解 CH340驱动电路 CH340系列芯片数据手册 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电路详解-CSDN博客 ME62…

【机器学习案列】使用随机森林(RF)进行白葡萄酒质量预测

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

PostgreSql-学习06-libpq之同步命令处理

目录 一、环境 二、介绍 三、函数 1、PQsetdbLogin (1)作用 (2)声明 (3)参数介绍 (4)检测成功与否 2、PQfinish (1)作用 (2&#xff0…

Reactor

文章目录 正确的理解发送double free问题 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb,而其他sock,读,写,异常 所以今天写nullptr其实就不太对,添加为空就没办法去响应事件 获…

Mac iOS、Android、Flutter、React Native开发环境配置

1.安装XCode https://apps.apple.com/cn/app/xcode/id497799835?mt12 2.安装Android Studio https://developer.android.google.cn/studio 3.安装brew 参考地址:https://www.jianshu.com/p/22122a1d4474 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunk…

[创业之路-200]:什么是business(业务)?B2B, B2C, B2G业务, 什么是业务设计?

目录 一、基本概念 1、基础定义 2、构成要素 3、业务流程 4、业务范围 5、语境中的含义 六、常见的业务类型 1、按行业分类 2、按运营模式分类 3、按业务性质分类 4、其他分类方式 三、B2B, B2C, B2G业务 1、B2B(Business-to-Business) 2、…

React,Antd实现文本输入框话题添加及删除的完整功能解决方案

最终效果就是实现该输入框: 添加话题时,话题自动插入到输入框前面多文本输入框左侧间距为话题的宽度多行文本时,第二行紧接开头渲染删除文本时,如果删除到话题,再次删除,话题被删除 首先构造div结构 cons…

【机器人】ATM 用于策略学习的任意点轨迹建模 RSS 2024 | 论文精读

文章提出了一种新的框架,名为Any-point Trajectory Modeling (ATM) ,称为任意点轨迹建模。 用于从视频中预测任意点的未来轨迹,从而在最少动作标签数据的情况下,学习稳健的视觉运动策略。 图中展示了三个案例,打开柜子…

Android 搭建AIDL Client和Server端,双向通信

一、背景 使用AIDL,搭建Client和Server端,实现跨进程通讯,即两个应用之间可以相互通讯。这里列举AIDL实现的方式和需注意的细节,并附上源码。 二、实现方式 2.1 定义AIDL需要的接口,名字为xxx.aidl,Client和Server端 AIDL接口的包名和aidl文件必须一致&#xff0c…

【VUE】14、VUE项目如何自动识别服务端是否发布了新版本

今天介绍的是通过轮询的方式去检测服务端是否发布了新版本,从而提醒客户刷新页面,提升用户体验。 1、实现思路 使用轮询的方式获取项目中 index.html 文件。查询文件引入的 JS 文件是否有更新( Vue 每次打包后会生成新的引入文件&#xff0…

空天地遥感数据识别与计算--数据分析如何助力农林牧渔、城市发展、地质灾害监测等行业革新

在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而,对于许多专业人士而言,如何高效地处…

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因: (1)大量的学科(尤其生物及材料科学)需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解; (2)科技的发展促进了综合网…

python数据分析:介绍pandas库的数据类型Series和DataFrame

安装pandas pip install pandas -i https://mirrors.aliyun.com/pypi/simple/ 使用pandas 直接导入即可 import pandas as pd pandas的数据结构 pandas提供了两种主要的数据结构:Series 和 DataFrame,类似于python提供list列表,dict字典,…

GMSSL的不同python版本

链接1(推荐) 这个使用的库,是gm ssl 3.1.1。为什么推荐?因为这个有C源码。 GitHub - GmSSL/GmSSL-Python: Python binding to the GmSSL library 链接2 这个使用的库,是gmssl 3.2.2。搜索3.2.2,找不到相…

Python:枚举(包含例题字符计数,反倍数,洁净数,扫雷)

一.枚举是什么 枚举:通过逐个尝试所有可能的值或组合来解决问题的方法。 将问题空间划分为一系列离散的状态,并通过遍历这些状态来寻找解决方案。 二.枚举流程 1.确定解空间(一维,二维等) 2.确定空间边界&#xff…

计算机网络 八股青春版

什么是HTTP?HTTP和HTTPS的区别 HTTP HTTP是超文本运输协议,是一种无状态(每次请求都是独立的)的应用层协议。用于在客户端和服务器之间传输超文本数据(如HTML文件)。默认端口是80数据以明文形式传输&#…

域名和服务器是什么?域名和服务器是什么关系?

在互联网的生态系统中,域名和服务器是两个至关重要的组成部分。它们共同构成了我们访问网站和使用在线服务的基础。那么域名和服务器是什么?域名和服务器是什么关系? 1、域名的概念 域名是互联网中用于标识特定地址的一种文字形式。它是用户访问网站时输入的易记…

设计模式之 abstract factory

适用场景 一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只想显示它们的接口而不是实现时 架构演示 首先client这个东西可以接触到…