diff --git a/core/connection.go b/core/connection.go index 5b5a26d..630572a 100644 --- a/core/connection.go +++ b/core/connection.go @@ -40,9 +40,11 @@ type ( session *session.Session // Session ngin *engine // engine - conn net.Conn // low-level conn fd - status int32 // 连接状态 - lastMid uint64 // 最近一次消息ID + status int32 // 连接状态 + conn net.Conn // low-level conn fd + packer packet.Packer // 封包、拆包器 + + lastMid uint64 // 最近一次消息ID // TODO 考虑独立出去作为一个中间件 lastHeartbeatAt int64 // 最近一次心跳时间 @@ -59,9 +61,11 @@ type ( func newConn(server *engine, conn net.Conn) *Connection { r := &Connection{ - conn: conn, - ngin: server, + ngin: server, + status: StatusStart, + conn: conn, + packer: server.packerFn(), lastHeartbeatAt: time.Now().Unix(), @@ -189,7 +193,7 @@ func (r *Connection) write() { } // packet pack data - p, err := r.ngin.packer.Pack(data.header, data.payload.([]byte)) + p, err := r.packer.Pack(data.header, data.payload.([]byte)) if err != nil { log.Error(err.Error()) break @@ -222,13 +226,13 @@ func (r *Connection) read() { return } - if r.ngin.packer == nil { + if r.packer == nil { log.Errorf("unexpected error: packer is nil") return } // warning: 为性能考虑,复用slice处理数据,buf传入后必须要copy再处理 - packets, err := r.ngin.packer.Unpack(buf[:n]) + packets, err := r.packer.Unpack(buf[:n]) if err != nil { log.Error(err.Error()) } diff --git a/core/engine.go b/core/engine.go index dda6275..0b82be6 100644 --- a/core/engine.go +++ b/core/engine.go @@ -42,7 +42,7 @@ type ( pipeline Pipeline // 消息管道 - packer packet.Packer // 封包、拆包器 + packerFn packet.NewPackerFunc // 封包、拆包器 processor Processor // 数据包处理器 serializer serialize.Serializer // 消息 序列化/反序列化 diff --git a/core/server.go b/core/server.go index d4af948..2bf5e56 100644 --- a/core/server.go +++ b/core/server.go @@ -107,9 +107,9 @@ func WithRouter(router Router) RunOption { } } -func WithPacker(packer packet.Packer) RunOption { +func WithPacker(fn packet.NewPackerFunc) RunOption { return func(server *Server) { - server.ngin.packer = packer + server.ngin.packerFn = fn } } diff --git a/core/server_test.go b/core/server_test.go index 0240645..8b180cb 100644 --- a/core/server_test.go +++ b/core/server_test.go @@ -15,7 +15,9 @@ func TestServer(t *testing.T) { Name: "N-Net", Mode: DevMode, }, - WithPacker(packet.NewNNetPacker()), + WithPacker(func() packet.Packer { + return packet.NewNNetPacker() + }), WithSerializer(nil), WithHeartbeatInterval(time.Hour), WithProcessor(NewNNetProcessor()), diff --git a/packet/packet.go b/packet/packet.go index 41d8a80..cd90812 100644 --- a/packet/packet.go +++ b/packet/packet.go @@ -16,4 +16,6 @@ type ( // Unpack 解包 Unpack(data []byte) ([]IPacket, error) } + + NewPackerFunc func() Packer )