一、前言
敬告:本文不讲解代码,只是把代码展示出来。
该代码之前的代码见
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 process2
import (
"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的内容SmsMes
var smsMes message.SmsMes
err := 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 实例,发送date
tf := &utils.Transfer{
Conn: conn, //
}
err := tf.WritePkg(data)
if err != nil {
fmt.Println("转发消息失败 err=", err)
}
}
client process 模块 smsMes.go 文件
package process
import (
"encoding/json"
"fmt"
"redis/day8/chatroom/common/message"
)
func outputGroupMes(mes *message.Message) {
//显示即可
//1. 反序列化mes.Data
var smsMes message.SmsMes
err := 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.取出 NotifyUserStatusMes
var notifyUserStatusMes message.NotifyUserStatusMes
json.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正在等待读取服务器发送的消息