Skip to content

Leaf 中如何做消息广播

Name5566 edited this page Aug 28, 2016 · 2 revisions

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

管理用户

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

users = make(map[int]*User)

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

type User struct {
    gate.Agent
}

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

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

一个最简单的广播的例子

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

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

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

agents 的管理:

// agent 被创建时
func rpcNewAgent(args []interface{}) {
	a := args[0].(gate.Agent)
	agents[a] = struct{}{}
}

// agent 被关闭时
func rpcCloseAgent(args []interface{}) {
	a := args[0].(gate.Agent)
	delete(agents, a)
}

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

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