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

ops/2024/12/23 2:55:54/

一、前言

敬告:本文不讲解代码,只是把代码展示出来。
该代码之前的代码见
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":""}}
消息类型不存在,无法处理

http://www.ppmy.cn/ops/144204.html

相关文章

linux中docker命令大全

基本命令 docker pull 拉取镜像 docker pull docker push 推送镜像到DockerRegistry docker push docker images 查看本地镜像 docker images docker rmi 删除本地镜像 docker rmi docker run 创建并运行容器(不能重复创建) docker run d…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…

设计模式——原型模式

设计模式——原型模式 目录 设计模式——原型模式介绍实现总结 介绍 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新的对象,而不是通过 new 操作符来创建对象。原型模式的核心思想是通过“复制”…

浔川AI翻译登录失败调查报告

《浔川 AI 翻译登录失败调查报告》 一、调查背景 近期收到部分用户反馈,在使用浔川 AI 翻译时出现登录失败的问题,为了及时解决该问题并提升用户体验,特展开此次调查。 二、调查范围与方法 本次调查涵盖了不同操作系统、网络环境以及设备类型…

Linux驱动开发应用层 2 点亮一个LED

目录 先来聊聊sysfs sysfs的具备的优势 LED在哪里? 先来聊聊sysfs 我们下面首先简单聊一下sysfs。他很重要的原因是因为我们跟底下的设备打交道,就是可以透过我们的sysfs来操作我们底层的设备, sysfs是Linux内核中的一个虚拟文件系统&…

贪心算法 greedy

文章目录 参考贪心算法[Leetcode455 分发饼干](https://leetcode.cn/problems/assign-cookies/description/)分析题解 [Leetcode135 分发糖果](https://leetcode.cn/problems/assign-cookies/description/)分析题解 leetcode435无重叠区间分析题解 参考 https://github.com/ch…

QT打包【非单个exe】

项目运行点击release 找到生成的.exe文件 复制.exe文件到一个新文件夹下 找到QT cmd文件打开 到文件所在盘 命令:F: 到.exe的文件夹路径下 cd F:\...\demo 【你的exe文件所在文件夹】 输入 windeployqt name.exe,name是可执行文件的名称 等…

利用Python爬虫快速获取商品历史价格信息

在电商时代,商品价格波动频繁,对于消费者和市场分析师来说,掌握商品的历史价格信息至关重要。这不仅能够帮助消费者做出更明智的购买决策,还能为市场趋势分析提供数据支持。本文将介绍如何使用Python爬虫技术快速获取商品的历史价…