go游戏后端开发29:实现游戏内聊天

接下来,我们再来开发一个功能,这个功能相对简单,就是聊天。在游戏里,我们会收到一个聊天请求,我们只需要做一个聊天推送即可。具体来说,就是谁发的消息,就推送给所有人,包括消息内容等信息。

为了实现这个功能,我们需要在合适的位置进行消息搜索。首先,我们要把消息搜出来。在搜索时,我们会参考笔记里的一些信息,比如 idtype(消息类型,不同发消息的情况会有不同的类型)、message(消息内容)以及收件人 ID(如果要发送给指定用户)。不过,我们这种消息一般是广播,发送给所有用户,所以通常都会成功。

有了这些信息后,我们对其进行解析,并返回结果。如果 type 等于聊天通知,我们就进入聊天相关流程,把用户 ID 等信息传递过去。之后,我们把消息原模原样地进行数据发送,即 send data。在发送过程中,我们会涉及聊天形式的编写等操作,最终实现消息发送。

具体代码如下:

复制代码
func (g *GameFrame) onGameChat(user *proto.RoomUser, session *remote.Session, data MessageData) {
	g.sendDataAll(GameChatPushData(user.ChairID, data.Type, data.Msg, data.RecipientID), session)
}

func (r *Room) SendDataAll(msg *stream.Msg, data any) {
	users := make([]stream.PushUser, 0)
	for _, v := range r.users {
		users = append(users, stream.PushUser{
			Uid:         v.UserInfo.Uid,
			ConnectorId: v.UserInfo.FrontendId,
		})
	}
	r.ServerMessagePush(msg, users, data)
}

func (r *Room) ServerMessagePush(msg *stream.Msg, users []stream.PushUser, data any) {
	pusher.GetPusher().Push(msg, users, data, "ServerMessagePush")
}

func (p *Pusher) Push(m *stream.Msg, users []stream.PushUser, data any, router string) {
	msgData, _ := json.Marshal(data)
	pm := stream.PushData{
		Data:   msgData,
		Router: router,
	}
	upm := &stream.PushMessage{
		Users:    users,
		PushData: pm,
		Msg:      m,
	}
	p.pushChan <- upm
}

在实现后,我们重新启动程序,在相应位置创建房间并加入房间(如 411126),然后发送消息,比如"快点吧"。可以看到,消息成功发出且其他人也能收到,相当于所有人都能看到这条消息。这就是一个简单的聊天功能实现。

相关推荐
张小姐的猫4 分钟前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
YuanDaima204835 分钟前
Linux 进阶运维与 AI 环境实战:进程管理、网络排错与 GPU 监控
linux·运维·服务器·网络·人工智能
lolo大魔王2 小时前
Linux 数据文件处理实战:排序、搜索、压缩、归档一站式详解
linux·运维·服务器
189228048612 小时前
NY382固态MT29F32T08GSLBHL8-24QM:B
大数据·服务器·人工智能·科技·缓存
xhbh6663 小时前
网关端口映射和路由器端口转发有什么区别?配置要点全解析
运维·服务器·网络·智能路由器·端口映射·映射·无痕网关
XMYX-03 小时前
37 - Go env 环境变量:配置管理与运行时控制
开发语言·golang
STDD3 小时前
Soulmask《灵魂面具》 专用服务器搭建教程
运维·服务器·github
半壶清水3 小时前
用P4 Tutorial、BMv2 和 Mininet‌解析网络第一集------模拟环境搭建
运维·服务器·网络·网络协议·tcp/ip
.YYY3 小时前
RHCE--Linux循环执行的例行性任务:crontab从入门到精通
linux·运维·服务器
2301_780789663 小时前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos