一、前言
敬告:本文不讲解代码,只是把代码展示出来。
该代码之前的代码见
go 聊天系统项目-1
go聊天系统项目-2 redis 验证用户id和密码
go聊天系统项目-3 redis注册用户
go聊天项目4-显示用户列表
注意:本文使用 go mod 管理代码。详情见 go 包相关知识
二、为实现客户端发消息功能修改代码
修改 common message 模块 message.go 代码
const 常量增加如下字段
SmsMesType = "SmsMes"
增加 SmsMes 结构体
// 增加一个SmsMes发送的消息
type SmsMes struct {Content string `json: "content"`User //匿名结构体,继承
}// SmsReMes
client model 模块增加 curUser.go 代码
package modelimport ("net""redis/day8/chatroom/common/message"
)type CurUser struct {Conn net.Connmessage.User
}
修改 client process 模块 userMgr.go 代码
增加导入
import ("redis/day8/chatroom/common/message")
增加全局变量
var CurUser model.CurUser //我们在用户登录成功后,完成对CurUser初始化
修改common message 模块 smsProcess.go 代码
在 User 机构体中增加如下字段
Sex string `json:"sex"` //性别
如下
type User struct {UserId int `json:"userId"`UserPwd string `json:"userPwd"`UserName string `json:"userName"`UserStatus int `json:"userStatus"` //用户状态Sex string `json:"sex"` //性别
}
修改 client process 模块 userProcess.go 代码
在 Login 方法的
var loginResMes message.LoginResMeserr = json.Unmarshal([]byte(mes.Data), &loginResMes)if loginResMes.Code == 200 {
代码下增加如下代码
//初始化CurUser
CurUser.Conn = conn
CurUser.UserId = userId
CurUser.UserStatus = message.UserOnline
修改 client process 模块 增加 smsProcess.go 代码
package processimport ("encoding/json""fmt""redis/day8/chatroom/client/utils""redis/day8/chatroom/common/message"
)type SmsProcess struct {
}// 发送群聊的消息
func (this *SmsProcess) SendGroupMes(content string) (err error) {//1 创建一个 Mesvar mes message.Messagemes.Type = message.SmsMesType//2 创建一个SmsMes实例var smsMes message.SmsMessmsMes.Content = content //内容smsMes.UserId = CurUser.UserIdsmsMes.UserStatus = CurUser.UserStatus//3.序列化 smsMesdata, err := json.Marshal(smsMes)if err != nil {fmt.Println("SendGroupMes json.Marshal fail =", err.Error())return}mes.Data = string(data)//4.对mes再次序列化data, err = json.Marshal(mes)if err != nil {fmt.Println("SendGroupMes json.Marshal fail =", err.Error())return}//5. 将mes发送给服务器tf := &utils.Transfer{Conn: CurUser.Conn,}//6. 发送err = tf.WritePkg(data)if err != nil {fmt.Println("SendGroupMes err=", err.Error())return}return
}
修改client process 模块 server.go 代码
在 ShowMenu 函数代码
fmt.Println("----------恭喜xxx登录成功--------")
fmt.Println("--------1、显示在线用户列表--------")
fmt.Println("--------2、发送消息--------")
fmt.Println("--------3、信息列表--------")
fmt.Println("--------4、退出系统--------")
var key int
var content string
下增加如下代码
//因为我们总会使用到SmsProcess实例,因此我们将其定义在swtich外部
smsProcess := &SmsProcess{}
将 switch key{case 2:} 中代码修改为如下
fmt.Println("请输入你想对大家说点什么:")
fmt.Scanf("%s\n", &content)
smsProcess.SendGroupMes(content)
修改 server processor 模块 processor.go 代码
在代码
func (this *Processor) serverProcessMes(mes *message.Message) (err error) {
下增加如下代码
//看看是否能接收到客户端发送的群发的消息
fmt.Println("mes=", mes)
测试一下
服务端
./main
服务器[新的结构]在 8889 端口监听......
等待客户端连接服务器......
等待客户端连接服务器......
mes= &{LoginMes {"UserId":100,"UserPwd":"123456","UserName":""}}
&{100 123456 tom 0 } 登录成功
客户端
./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正在等待读取服务器发送的消息
客户端
2
请输入你想对大家说点什么:
hello,body!
----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------
服务端
mes= &{SmsMes {"Content":"hello,body!","userId":100,"userPwd":"","userName":"","userStatus":0,"sex":""}}
消息类型不存在,无法处理