lonng / nano

Lightweight, facility, high performance golang based game server framework
MIT License
2.88k stars 445 forks source link

Kick数据包类型并没有实现封装调用入口吗 #81

Open lwelcom opened 3 years ago

lwelcom commented 3 years ago

Question @lonng

// Kick represents a kick off packet Kick = 0x05 // disconnect message from server

请问这个数据包类型并没有实现吗? 源码没有一个地方调用过该类型。应该需要额外加一个类似s.Response接口来处理Kick类型的数据包吧。

客户端虽然有这个数据包类型的定义接收,但是服务端没有实现这个数据包类型的封装? handlers[Package.TYPE_KICK] = onKick;

lwelcom commented 3 years ago

改造如下: 1 session.go文件增加对外暴露方法接口并实现 type NetworkEntity interface { ResponseKick(v interface{}) error }

2.实现 acceptor.go和agent.go 分别实现ResponseKick message.go 增加一个类型 Kick = 0x04

3.回包的时候就指定回packet.Kick类型 func (a *agent) write() { // packet encode var packetType packet.Type if data.typ == message.Kick { packetType = packet.Kick }else { packetType = packet.Data }

        p, err := codec.Encode(packetType, em)

}

这样响应客户端就能通过如下解析 handlers[Package.TYPE_KICK] = onKick;

@lonng 这样合理吗, 因为你源码没有一个地方实现了Kick = 0x05 回包类型。

lonng commented 3 years ago

Yes, Prefer

type NetworkEntity interface {
    Kick(v interface{}) error
}
novel045 commented 10 months ago

1.

type NetworkEntity interface {
    Kick(v interface{}) error
}

2.

// Kick message to client
func (s *Session) Kick(v interface{}) error {
    return s.entity.Kick(v)
}
  1. message.go
    Kick Type = 0x04
  2. handler.go
    kick, err = codec.Encode(packet.Kick, nil)
    if err != nil {
        panic(err)
    }
  3. agent.go
    
    func (a *agent) Kick(v interface{}) error {
    if a.status() == statusClosed {
        return ErrBrokenPipe
    }
    return a.send(pendingMessage{typ: message.Kick})
    }

func(a * agent)write(){ ...省略 if data.typ == message.Kick { chWrite <- kick break } ...省略 }