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