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), ¬ifyUserStatusMes)//2.把这个用户的信息,状态保存到客户 mqp[int]User 中updateUserStatus(¬ifyUserStatusMes)//处理
下增加如下代码
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正在等待读取服务器发送的消息