//go:build server || (!server && !client) package main import ( "log" "os" "os/signal" "syscall" internalprotocol "github.com/noahlann/nnet/internal/protocol/nnet" "github.com/noahlann/nnet/pkg/nnet" ) // This example demonstrates protocol version management. // It registers multiple versions of the nnet protocol and uses them based on configuration. func main() { cfg := &nnet.Config{ Addr: "tcp://:8082", // 指定应用层协议名称 ApplicationProtocol: "nnet", Codec: &nnet.CodecConfig{ // 与库默认保持一致:binary 为默认 DefaultCodec: "binary", EnableProtocolEncode: true, // 启用协议层编码 }, } srv, err := nnet.NewServer(cfg) if err != nil { log.Fatal("create server:", err) } // 注册多个版本的协议 pm := srv.ProtocolManager() // 注册 v1.0 版本 protoV1 := internalprotocol.NewNNetProtocol("1.0") if err := pm.Register(protoV1); err != nil { log.Fatal("register protocol v1.0:", err) } // 注册 v2.0 版本 protoV2 := internalprotocol.NewNNetProtocol("2.0") if err := pm.Register(protoV2); err != nil { log.Fatal("register protocol v2.0:", err) } // 设置默认协议版本为 v1.0 if err := pm.SetDefault("nnet", "1.0"); err != nil { log.Fatal("set default protocol:", err) } log.Println("Registered protocols:") log.Println(" - nnet v1.0 (default)") log.Println(" - nnet v2.0") // 注册路由处理器 srv.Router().RegisterString("version", func(ctx nnet.Context) error { // 获取当前使用的协议信息 proto := pm.GetDefault() if proto != nil { return ctx.Response().Write(map[string]any{ "protocol": proto.Name(), "version": proto.Version(), }) } return ctx.Response().Write(map[string]any{ "protocol": "unknown", "version": "unknown", }) }) // 注册另一个路由,演示协议版本的使用 srv.Router().RegisterString("echo", func(ctx nnet.Context) error { // 回显请求数据 data := ctx.Request().Raw() return ctx.Response().Write(map[string]any{ "echo": string(data), "length": len(data), }) }) log.Println("protocol_version_server listening on :8082") log.Println("Protocol: nnet v1.0 (default)") if err := srv.Start(); err != nil { log.Fatal("start server:", err) } defer srv.Stop() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit }