大厅服务器概述

大厅服务器负责玩家进入游戏的接入、发送公告等功能。当玩家登陆完毕、游戏结束后将会进入大厅服务器。

  大厅服务器需求

  1. 公告
  2. 对玩家进行匹配
  3. 创建房间
  4. 加入房间

大厅服务器结构

大厅服务器流程

    

大厅服务器细节

由于使用了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发送给正处于定时状态的函数,接收到信息的函数将结果返回。

房间类游戏后台框架(三)—大厅服务器相关推荐

  1. 房间类游戏后台框架(一)—介绍

    闲来无事用GO语言写了个简易的房间类游戏后台框架,目前实现基本房间功能,并放了贪吃蛇游戏进去,可实现多人在线贪吃蛇.由于没有前端,导致项目难以继续下去.整个项目大概完成75%,基本目标也都实现,看以后 ...

  2. 房间类游戏后台框架(四)—游戏服务器

    游戏服务器概述: 游戏服务器装载着游戏对外服务,对于房间类游戏其功能包括房间的创建.进入房间.离开房间.开始游戏.结束游戏.由于不同游戏对应的逻辑不通,如果需要代码共用,则可将房间的操作分离出来做成一 ...

  3. JavaFX战旗类游戏开发 第三课 创建游戏角色

    在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.Graph ...

  4. 大型MMO-SNS类游戏服务器架构

    SNS类型的游戏和RPG类的网游有一些不同的特点,而这些特点会导致这类游戏的后台架构和RPG网游的后台架构存在一些区别. SNS类型的游戏一般有以下的特点: (1)所有的玩家角色可能存在交互 SNS类 ...

  5. php实现棋牌房间,App房卡棋牌类游戏也有了一键进入房间的神操作!

    APP房间类游戏,要想有竞争力,关键就在于下载安装方便和进入游戏房间方便--其实就是拉朋友方便,这样才能够更快发展用户量和改善用户消费时的体验.减少在多个中转环节中的损耗以增加用户的消费时长. 这些方 ...

  6. 【Unity3D插件】uMOBA插件分享《Moba类游戏框架插件》

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 今天介绍一款MOBA游戏的插件,已经有一个雏形了,可以作为开发的模 ...

  7. 棋牌类游戏服务器架构全面总结

    一.棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间 ...

  8. 牌类游戏使用微服务重构笔记(八): 游戏网关服务器

    网关服务器 所谓网关,其实就是维持玩家客户端的连接,将玩家发的游戏请求转发到具体后端服务的服务器,具有以下几个功能点: 长期运行,必须具有较高的稳定性和性能 对外开放,即客户端需要知道网关的IP和端口 ...

  9. mysql服务端放置_放置类游戏后端服务器架构设计与实现

    前言: 停更了一段时间.2020年也接近尾声了,调整了一下人生状态,继续前进. 今年完全参与了一款放置类游戏从0到开发上线再到合服.从目前市场上买量游戏的发展线路来看,合服意味着游戏走向压榨玩家的最后 ...

最新文章

  1. 排序算法中——归并排序和快速排序
  2. Celery介绍和使用
  3. 计算机数据恢复专业,专业电脑数据恢复软件哪个好
  4. javaee编程题_在JavaEE中使用CDI的简单面向方面的编程(AOP)
  5. S5PV210启动过程
  6. django+mysql+插入数据库网页展示内容
  7. MSSQL游标的原理及示例
  8. Ubuntu环境变量添加的安全方法
  9. Linux命令发送Http请求
  10. TV Input Framework --Android官方说明
  11. [学习笔记-SLAM篇]视觉SLAM十四讲ch3
  12. 360安全桌面壁纸被设为壁纸后的路径xp
  13. 基于MyScript的C#版本手写板 准确的识别中文
  14. python os.walk如何不遍历隐藏文件,Python os.walk() 遍历出当前目录下的文件夹和文件...
  15. 记录List做分页、模糊搜索、时间排序
  16. 西瓜视频稳定性治理体系建设三:Sliver 原理及实践
  17. 日常(魔鬼本鬼又来了)
  18. 一个项目的大体架构及想法。
  19. 练习-CTF解题 - XMAN比赛 8-8-babyweb(netspark扫扫)
  20. python外文文献翻译_英文学术文献翻译软件有哪些推荐?

热门文章

  1. origin论文画图记录
  2. (HttpClient技术)(58同城系列)58同城登录
  3. Docker容器-------网络模式,数据卷和数据卷容器
  4. Lucene搜索引擎-搜索
  5. 风铃机器码修改器2.2单进程单ID硬件信息用于解除机器码硬件修改大师多开器部分游戏
  6. 2018互联网金融公司排名——Top100(附完整榜单)
  7. 海明校验码原来这样算!!!
  8. 菜鸟学JAVA之——static静态代码块
  9. Python -- 限流 throttle
  10. 不同公司5%重仓持股统计(2011-2021年)