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":""}}
消息类型不存在,无法处理
相关推荐
Ciderw9 小时前
TCP三次握手和四次挥手
开发语言·网络·c++·后端·网络协议·tcp/ip·golang
{⌐■_■}14 小时前
【Validator】字段验证器struct与多层级验证,go案例
开发语言·信息可视化·golang
Pandaconda14 小时前
【Golang 面试题】每日 3 题(四十三)
开发语言·经验分享·笔记·后端·面试·golang·go
兮动人15 小时前
Go语言快速开发入门
开发语言·后端·golang·go语言快速开发入门
stevewongbuaa16 小时前
一些烦人的go设置 goland
开发语言·后端·golang
hust_joker17 小时前
go单元测试和基准测试
开发语言·golang·单元测试
m0_7482556520 小时前
环境安装与配置:全面了解 Go 语言的安装与设置
开发语言·后端·golang
加油,旭杏2 天前
【go语言】map 和 list
开发语言·golang·list
薛语澄2 天前
CSS语言的网络编程
开发语言·后端·golang
川Princess2 天前
【后端开发】字节跳动青训营之Go语言进阶与依赖管理
开发语言·后端·golang