Leaf 在消息广播上,没有做任何的优化,使用最简单粗暴的方式。

管理用户

游戏服务器一定需要用户管理,最常见的方式就是建立用户 ID 到用户实例的映射关系(还有可能存在用户帐号 ID、用户名到用户实例的映射关系)。例如:

  1. users = make(map[int]*User)

User 本身为了简单,可以直接组合 Agent:

  1. type User struct {
  2. gate.Agent
  3. }

这样的话,广播消息就是:

  1. for _, user := range users {
  2. user.WriteMsg(msg)
  3. }

一个最简单的广播的例子

本例子只是为了简单演示,而没有任何实际使用意义。

打开 Leafserver game/internel/chanrpc.go 文件,加入一个全局变量:

  1. var agents = make(map[gate.Agent]struct{})

agents 的管理:

  1. // agent 被创建时
  2. func rpcNewAgent(args []interface{}) {
  3. a := args[0].(gate.Agent)
  4. agents[a] = struct{}{}
  5. }
  6. // agent 被关闭时
  7. func rpcCloseAgent(args []interface{}) {
  8. a := args[0].(gate.Agent)
  9. delete(agents, a)
  10. }

由此可见 agents 中保存了当前所有连接,广播的处理:

  1. for a := range agents {
  2. a.WriteMsg(msg)
  3. }