go聊天系统项目6-服务端发送消息

发布于:2025-02-11 ⋅ 阅读:(116) ⋅ 点赞:(0)

一、前言

敬告:本文不讲解代码,只是把代码展示出来。
该代码之前的代码见
go 聊天系统项目-1
go聊天系统项目-2 redis 验证用户id和密码
go聊天系统项目-3 redis注册用户
go聊天项目4-显示用户列表
go 聊天系统项目-5 客户端发消息
注意:本文使用 go mod 管理代码。详情见 go 包相关知识

修改和增加代码

server processor 模块 processor.go

func (this *Processor) serverProcessMes(mes *message.Message) (err error) {
......
	case message.RegisterMesType:
		//处理注册
		up := &process2.UserProcess{
			Conn: this.Conn,
		}
		err = up.ServerProcessRegister(mes)
case message.SmsMesType:
	//创建一个SmsProcess实例完成转发群聊消息
	smsProcess := &process2.SmsProcess{}
	smsProcess.SendGroupMes(mes)

server process2 包 smsProcess.go 文件

package process2

import (
	"encoding/json"
	"fmt"
	"net"
	"redis/day8/chatroom/common/message"
	"redis/day8/chatroom/server/utils"
)

type SmsProcess struct {
}

func (this *SmsProcess) SendGroupMes(mes *message.Message) {
	//遍历服务器端的onlineUsers map[int]*UserProcess
	//将消息转发取出

	//取出mes的内容SmsMes
	var smsMes message.SmsMes
	err := json.Unmarshal([]byte(mes.Data), &smsMes)
	if err != nil {
		fmt.Println("json.Unmarshal err=", err)
		return
	}
	data, err := json.Marshal(mes)
	if err != nil {
		fmt.Println("json.Marshal err=", err)
		return
	}
	for id, up := range userMgr.onlineUsers {
		//这里,还需要过滤掉自己,即不要发送给自己
		if id == smsMes.UserId {
			continue
		}
		this.SendMesToEachOnlineUser(data, up.Conn)
	}

}

func (this *SmsProcess) SendMesToEachOnlineUser(data []byte, conn net.Conn) {
	//创建一个Transfer 实例,发送date
	tf := &utils.Transfer{
		Conn: conn, //
	}
	err := tf.WritePkg(data)
	if err != nil {
		fmt.Println("转发消息失败 err=", err)
	}
}

client process 模块 smsMes.go 文件

package process

import (
	"encoding/json"
	"fmt"
	"redis/day8/chatroom/common/message"
)

func outputGroupMes(mes *message.Message) {
	//显示即可
	//1. 反序列化mes.Data
	var smsMes message.SmsMes
	err := json.Unmarshal([]byte(mes.Data), &smsMes)
	if err != nil {
		fmt.Println("json.Unmarshal err=", err.Error())
		return
	}
	//显示
	info := fmt.Sprintf("用户id:\t%d 对大家说:\t%s", smsMes.UserId, smsMes.Content)
	fmt.Println(info)
}

client process 模块 server.go 文件

在代码

func serverProcessMes(conn net.Conn) {
...
		case message.NotifyUserStatusMesType: //有人上线了
			//1.取出 NotifyUserStatusMes
			var notifyUserStatusMes message.NotifyUserStatusMes
			json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
			//2.把这个用户的信息,状态保存到客户 mqp[int]User 中
			updateUserStatus(&notifyUserStatusMes)
			//处理

下增加如下代码

case message.SmsMesType: //有人群发消息
	outputGroupMes(&mes)

编译

cd /Users/zld/Go-project/src
go build -o main main.go
go build -o client day8/chatroom/client/main/main.go

群发消息测试

服务端

./main 
服务器[新的结构]8889 端口监听......
等待客户端连接服务器......
等待客户端连接服务器......
mes= &{LoginMes {"UserId":100,"UserPwd":"123456","UserName":""}}
&{100 123456 tom 0 } 登录成功
等待客户端连接服务器......
mes= &{LoginMes {"UserId":200,"UserPwd":"123456","UserName":""}}
&{200 123456 jack 0 } 登录成功
等待客户端连接服务器......
mes= &{LoginMes {"UserId":300,"UserPwd":"123456","UserName":""}}
&{300 123456 scott 0 } 登录成功

客户端1

./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正在等待读取服务器发送的消息
用户id:  200
客户端%s正在等待读取服务器发送的消息
用户id:  200
用户id:  300
客户端%s正在等待读取服务器发送的消息

客户端2

./client 
---------------欢迎登录多人聊天系统-------------------
                         1、登录聊天室
                         2、注册用户
                         3、退出系统
                         请选择(1-3):
1
登录聊天室
请输入用户的id
200
请输入用户密码
123456
客户端,发送消息的长度=86,消息内容为: {"Type":"LoginMes","Data":"{\"UserId\":200,\"UserPwd\":\"123456\",\"UserName\":\"\"}"}
当前在线用户列表如下:
用户id:  100



----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------
客户端%s正在等待读取服务器发送的消息
用户id:  300
用户id:  100
客户端%s正在等待读取服务器发送的消息

客户端3

./client 
---------------欢迎登录多人聊天系统-------------------
                         1、登录聊天室
                         2、注册用户
                         3、退出系统
                         请选择(1-3):
1
登录聊天室
请输入用户的id
300
请输入用户密码
123456
客户端,发送消息的长度=86,消息内容为: {"Type":"LoginMes","Data":"{\"UserId\":300,\"UserPwd\":\"123456\",\"UserName\":\"\"}"}
当前在线用户列表如下:
用户id:  200
用户id:  100



----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------
客户端%s正在等待读取服务器发送的消息

客户端3群发消息

2
请输入你想对大家说点什么:
hello
----------恭喜xxx登录成功--------
--------1、显示在线用户列表--------
--------2、发送消息--------
--------3、信息列表--------
--------4、退出系统--------

服务端
mes= &{SmsMes {“Content”:“hello”,“userId”:300,“userPwd”:“”,“userName”:“”,“userStatus”:0,“sex”:“”}}
客户端1

用户id: 300 对大家说:   hello
客户端%s正在等待读取服务器发送的消息

客户端2

用户id: 300 对大家说:   hello
客户端%s正在等待读取服务器发送的消息

网站公告

今日签到

点亮在社区的每一天
去签到