当前位置: 首页 > news >正文

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.mrgr.cn/news/81047.html

相关文章:

  • Mysql 查询性能调优总结
  • 青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎
  • WebRTC服务质量(07)- 重传机制(04) 接收NACK消息
  • 重拾设计模式-外观模式和适配器模式的异同
  • CentOS 7 上自动安装 Python 3.9 脚本
  • 三相异步电动机如何调试?
  • SSH特性|组成|SSH是什么?
  • 精通Redis
  • 2023年厦门市第30届小学生C++信息学竞赛复赛上机操作题(三、2023C. 太空旅行(travel))
  • 力学笃行(二)Qt 示例程序运行
  • 腾讯云云开发 Copilot 深度探索与实战分享
  • 【多模态】swift-3框架使用
  • 定时任务——定时任务技术选型
  • dockerfile文档编写(2):docker pull和pip镜像加速
  • 【Rust自学】4.4. 引用与借用
  • javaEE--计算机是如何工作的-1
  • 【Rust自学】5.1. 定义并实例化struct
  • Timsort算法
  • 排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
  • 【Rust自学】4.5. 切片(Slice)
  • yolov8的标签匹配解析
  • 39.在 Vue3 中使用 OpenLayers 导出 GeoJSON 文件及详解 GEOJSON 格式
  • 多个Echart遍历生成 / 词图云
  • [Java]合理封装第三方工具包(附视频)
  • 数据仓库工具箱—读书笔记02(Kimball维度建模技术概述03、维度表技术基础)
  • 海格通信嵌入式面试题及参考答案