name5566 / leaf

A game server framework in Go (golang)
Apache License 2.0
5.26k stars 1.31k forks source link

a.WriteMsg()偶现推送回写客户端没有接收到信息 #179

Closed xuhuaiqu closed 4 years ago

xuhuaiqu commented 4 years ago

如下 使用了一个全局变量来存储某个房间的客户端 var clients = make(map[string]map[gate.Agent]struct{}) 后面给单个用户写消息时,客户端有部分消息会收不到。框架这里也没有捕获到异常信息。 小白请教:为啥这里的错误不返回到上级处理呢?

 func BordCastInitCard(RoomId string, UserId string, Msg *msg.InitCardBrod)  {
    for a, _ := range clients[RoomId] {
        userData := a.UserData()
        if userData != nil {
            agentData := userData.(*data.UserData)

            if agentData.UserId == UserId  {
                a.WriteMsg(Msg)
            }
        }
    }
}

func (a *agent) WriteMsg(msg interface{}) {
    if a.gate.Processor != nil {
        data, err := a.gate.Processor.Marshal(msg)
        if err != nil {
            log.Error("marshal message %v error: %v", reflect.TypeOf(msg), err)
            return
        }
        err = a.conn.WriteMsg(data...)
        if err != nil {
            log.Error("write message %v error: %v", reflect.TypeOf(msg), err)
        }
    }
}
name5566 commented 4 years ago

在 Leaf 实际运行中,我没有遇见,也没有听到上线游戏反馈你说的问题。在没有修改 Leaf 代码的情况下,不会出现消息收不到和 recover 的问题。可以考虑一下几个方面:

  1. 服务器是否可能存在并发导致的问题(无论修改还是没有修改底层代码都需要考虑)
  2. 服务器是否存在可能的逻辑 bug
  3. 客户端是否存在可能的逻辑 bug
  4. 如果问题出现在压力测试,需要检查压力测试工具程序(此为常见问题)
xuhuaiqu commented 4 years ago

好的 感谢