nano icon indicating copy to clipboard operation
nano copied to clipboard

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

Open lwelcom opened this issue 4 years ago • 3 comments
trafficstars

Question @lonng

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

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

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

lwelcom avatar Sep 13 '21 08:09 lwelcom

改造如下: 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 回包类型。

lwelcom avatar Sep 13 '21 12:09 lwelcom

Yes, Prefer

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

lonng avatar Sep 13 '21 23:09 lonng

type NetworkEntity interface {
    Kick(v interface{}) error
}
// Kick message to client
func (s *Session) Kick(v interface{}) error {
	return s.entity.Kick(v)
}
  1. message.go
  Kick Type = 0x04
  1. handler.go
	kick, err = codec.Encode(packet.Kick, nil)
	if err != nil {
		panic(err)
	}
  1. 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
			}
...省略
}



novel045 avatar Jan 04 '24 12:01 novel045