go 聊天系统项目-5 客户端发消息

一、前言

敬告:本文不讲解代码,只是把代码展示出来。

该代码之前的代码见
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":""}}
消息类型不存在,无法处理
相关推荐
LuckyLay3 小时前
Golang学习笔记_15——range
笔记·学习·golang·range
非凡的世界6 小时前
Go web 开发框架 Iris
开发语言·golang·iris
Clown959 小时前
go-zero(十五)缓存实践:分页列表
开发语言·缓存·golang
007php00712 小时前
go语言zero框架中config读取不到.env文件问题排查与解决方案
java·开发语言·后端·python·golang·aigc·ai编程
_小许_21 小时前
Go语言后台实现选中式导出excel文件
开发语言·golang·excel
1-programmer1 天前
Go context 对HTTP请求的影响
开发语言·http·golang
zyh_0305211 天前
GIN
开发语言·后端·golang·gin
ahhhhaaaa-1 天前
【AI图像生成网站&Golang】项目测试与优化
开发语言·后端·性能优化·golang·pprof·trace
007php0071 天前
k8s服务搭建与实战案例
linux·运维·服务器·云原生·容器·golang·kubernetes