当前位置: 首页 > article >正文

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

一、前言

敬告:本文不讲解代码,只是把代码展示出来。
该代码之前的代码见
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 model

import (
	"net"
	"redis/day8/chatroom/common/message"
)

type CurUser struct {
	Conn net.Conn
	message.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.LoginResMes
	err = 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 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 函数代码

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.kler.cn/a/446354.html

相关文章:

  • 在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。
  • fastdds:idl
  • 腾讯云云开发 Copilot 深度探索与实战分享
  • 在 Spring Boot 3 中实现基于角色的访问控制
  • MySQL数据库——门诊管理系统数据库数据表
  • 【JavaEE进阶】关于Maven
  • Kubernetes(k8s)离线部署DolphinScheduler3.2.2
  • C# 动态组合判断条件对数据进行筛选
  • 大厂 Java 架构师面试题全解析
  • 【人工智能数学基础篇】——深入详解矩阵与向量运算及矩阵分解技术,打牢人工智能知识基础
  • OpenHarmony-4.HDI 框架
  • Github 2024-12-21 Rust开源项目日报 Top10
  • react websocket 全局访问和响应
  • Flink CDC 生产环境常用参数总结
  • 解决 Jenkins 克隆 GitHub 仓库时的 SSH 公钥认证问题
  • DC-9笔记
  • GitHub Copilot 现在可以免费使用了!
  • Leetcode Hot 100 【二叉树】104. 二叉树的最大深度
  • Docker 安装 禅道-21.2版本-外部数据库模式
  • 【day09】面向对象——静态成员和可变参数
  • 接口测试-Fidder及jmeter使用
  • JetBrains IDEA 2024 在使用 lombok 后构建失败/编译失败解决方案
  • Swin transformer 论文阅读记录 代码分析
  • 在树莓派 Pico 上运行 AWTK
  • WPF DataTemplate 数据模板
  • wordpress调用指定分类ID下 相同标签的内容