房间类游戏后台框架(三)—大厅服务器
大厅服务器概述
大厅服务器负责玩家进入游戏的接入、发送公告等功能。当玩家登陆完毕、游戏结束后将会进入大厅服务器。
大厅服务器需求
- 公告
- 对玩家进行匹配
- 创建房间
- 加入房间
大厅服务器结构
大厅服务器流程
大厅服务器细节
由于使用了Redis当作全局内存,其实游戏大厅只是一个使用Redis进行业务操作的模块。在线匹配功能后期可以划分为匹配服务器,降低游戏大厅负载。
在创建房间过程中,大厅服务器对在线的游戏服务进行遍历,负载低的服务器优先创建房间。
由于使用了消息队列,因此并不能同步发送信息,因此写了组件专门处理使异步操作使其变为同步操作,代码如下:
type BlockVisit struct {Message map[string]chan grpc_common.Messagesync.RWMutex
}func (block *BlockVisit) Get(name string) (chan grpc_common.Message, error) {block.RLock()defer block.RUnlock()message, exit := block.Message[name]if !exit {return nil, errors.New("error messageid")}return message, nil
}func (block *BlockVisit) GrpcSend(client *Grpc_client, Message grpc_common.MessageRouter, timeout int) (grpc_common.Message, error) {// 设置信息为发送出去处理Message.RouteMessage.DealMessage = truemessage := make(chan grpc_common.Message, 1)block.Lock()MessageId := block.NewId()block.Message[MessageId] = messageMessage.RouteMessage.MessageId = MessageIdsendmessage, err := grpc_common.Encode(&Message)if err != nil {return grpc_common.Message{}, err}err = client.WriteMessage(sendmessage)if err != nil {delete(block.Message, MessageId)block.Unlock()return grpc_common.Message{}, err}block.Unlock()timer := time.NewTicker(time.Duration(timeout) * time.Second)select {case <-timer.C:block.Lock()delete(block.Message, MessageId)block.Unlock()return grpc_common.Message{}, errors.New("Time out")case m := <-message:block.Lock()delete(block.Message, MessageId)block.Unlock()if m.GetName() == MessageNotFindItem {return grpc_common.Message{}, errors.New(MessageNotFindItem)}return m, nil}
}func (block *BlockVisit) RabbitmqSend(client *RabbitMq,Message grpc_common.Message,Item string,timeout int)(*grpc_common.Message,error){Message.DealMessage = trueMessageChan := make(chan grpc_common.Message, 1)block.Lock()MessageId := block.NewId()block.Message[MessageId] = MessageChanMessage.MessageId = MessageIdblock.Unlock()MessageData,err:= proto.Marshal(&Message)if err!=nil{return nil,err}client.Publish(Item,MessageData)timer := time.NewTicker(time.Duration(timeout) * time.Second)select {case <-timer.C:block.Lock()delete(block.Message, MessageId)block.Unlock()return nil, errors.New("Time out")case m := <-MessageChan:block.Lock()delete(block.Message, MessageId)block.Unlock()return &m,nil}
}// 使用需上锁
func (block *BlockVisit) NewId() string {var ID stringfor true {ID = GetRandomString(10)_, exit := block.Message[ID]if !exit {return ID}}return ""
}func GetRandomString(l int) string {str := "0123456789abcdefghijklmnopqrstuvwxyz"bytes := []byte(str)result := []byte{}r := rand.New(rand.NewSource(time.Now().UnixNano()))for i := 0; i < l; i++ {result = append(result, bytes[r.Intn(len(bytes))])}return string(result)
}
原理很简单,为发送的信息生成唯一ID,并将其ID对应一个channel。当发送出去时启动一个定时器,当定时器超时返回错误。如果接收到对应ID,则将其信息通过channel发送给正处于定时状态的函数,接收到信息的函数将结果返回。
房间类游戏后台框架(三)—大厅服务器相关推荐
- 房间类游戏后台框架(一)—介绍
闲来无事用GO语言写了个简易的房间类游戏后台框架,目前实现基本房间功能,并放了贪吃蛇游戏进去,可实现多人在线贪吃蛇.由于没有前端,导致项目难以继续下去.整个项目大概完成75%,基本目标也都实现,看以后 ...
- 房间类游戏后台框架(四)—游戏服务器
游戏服务器概述: 游戏服务器装载着游戏对外服务,对于房间类游戏其功能包括房间的创建.进入房间.离开房间.开始游戏.结束游戏.由于不同游戏对应的逻辑不通,如果需要代码共用,则可将房间的操作分离出来做成一 ...
- JavaFX战旗类游戏开发 第三课 创建游戏角色
在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.Graph ...
- 大型MMO-SNS类游戏服务器架构
SNS类型的游戏和RPG类的网游有一些不同的特点,而这些特点会导致这类游戏的后台架构和RPG网游的后台架构存在一些区别. SNS类型的游戏一般有以下的特点: (1)所有的玩家角色可能存在交互 SNS类 ...
- php实现棋牌房间,App房卡棋牌类游戏也有了一键进入房间的神操作!
APP房间类游戏,要想有竞争力,关键就在于下载安装方便和进入游戏房间方便--其实就是拉朋友方便,这样才能够更快发展用户量和改善用户消费时的体验.减少在多个中转环节中的损耗以增加用户的消费时长. 这些方 ...
- 【Unity3D插件】uMOBA插件分享《Moba类游戏框架插件》
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 今天介绍一款MOBA游戏的插件,已经有一个雏形了,可以作为开发的模 ...
- 棋牌类游戏服务器架构全面总结
一.棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间 ...
- 牌类游戏使用微服务重构笔记(八): 游戏网关服务器
网关服务器 所谓网关,其实就是维持玩家客户端的连接,将玩家发的游戏请求转发到具体后端服务的服务器,具有以下几个功能点: 长期运行,必须具有较高的稳定性和性能 对外开放,即客户端需要知道网关的IP和端口 ...
- mysql服务端放置_放置类游戏后端服务器架构设计与实现
前言: 停更了一段时间.2020年也接近尾声了,调整了一下人生状态,继续前进. 今年完全参与了一款放置类游戏从0到开发上线再到合服.从目前市场上买量游戏的发展线路来看,合服意味着游戏走向压榨玩家的最后 ...
最新文章
- 排序算法中——归并排序和快速排序
- Celery介绍和使用
- 计算机数据恢复专业,专业电脑数据恢复软件哪个好
- javaee编程题_在JavaEE中使用CDI的简单面向方面的编程(AOP)
- S5PV210启动过程
- django+mysql+插入数据库网页展示内容
- MSSQL游标的原理及示例
- Ubuntu环境变量添加的安全方法
- Linux命令发送Http请求
- TV Input Framework --Android官方说明
- [学习笔记-SLAM篇]视觉SLAM十四讲ch3
- 360安全桌面壁纸被设为壁纸后的路径xp
- 基于MyScript的C#版本手写板 准确的识别中文
- python os.walk如何不遍历隐藏文件,Python os.walk() 遍历出当前目录下的文件夹和文件...
- 记录List做分页、模糊搜索、时间排序
- 西瓜视频稳定性治理体系建设三:Sliver 原理及实践
- 日常(魔鬼本鬼又来了)
- 一个项目的大体架构及想法。
- 练习-CTF解题 - XMAN比赛 8-8-babyweb(netspark扫扫)
- python外文文献翻译_英文学术文献翻译软件有哪些推荐?