package nnet import ( "fmt" "io" "net/http" "github.com/noahlann/nnet/internal/connection" "github.com/noahlann/nnet/internal/server" codecpkg "github.com/noahlann/nnet/pkg/codec" "github.com/noahlann/nnet/pkg/config" protocolpkg "github.com/noahlann/nnet/pkg/protocol" routerpkg "github.com/noahlann/nnet/pkg/router" ) // Server 服务器接口 type Server interface { // Start 启动服务器 Start() error // Stop 停止服务器 Stop() error // Router 获取路由器 Router() routerpkg.Router // ConnectionManager 获取连接管理器 ConnectionManager() connection.ManagerInterface // Config 获取配置 Config() *config.Config // Started 检查服务器是否已启动 Started() bool // Metrics 获取指标收集器 Metrics() Metrics // HealthChecker 获取健康检查器 HealthChecker() HealthChecker // MetricsHandler 返回默认的Metrics HTTP处理器 MetricsHandler() http.Handler // HealthHandler 返回默认的健康检查HTTP处理器 HealthHandler() http.Handler // ExportMetrics 将指标写入提供的Writer ExportMetrics(io.Writer) error // CodecRegistry 获取编解码器注册表 CodecRegistry() codecpkg.Registry // ProtocolManager 获取协议管理器 ProtocolManager() protocolpkg.Manager } // NewServer 创建新服务器(根据配置或地址自动选择传输层协议) // 传输层协议优先级: // 1. 如果配置中指定了TransportProtocol,使用指定的协议 // 2. 否则根据地址前缀判断(tcp://, udp://, ws://, wss://, unix://, serial://) // 3. 如果无法识别,默认使用TCP // 应用层协议通过 ApplicationProtocol 配置指定(如nnet) func NewServer(cfg *Config) (Server, error) { if cfg == nil { cfg = config.DefaultConfig() } // 优先使用配置中指定的传输层协议 if cfg.TransportProtocol != "" { return newServerByProtocol(cfg, cfg.TransportProtocol) } // 根据地址前缀判断传输层协议 return newServerByAddr(cfg) } // newServerByProtocol 根据指定的传输层协议创建服务器 func newServerByProtocol(cfg *Config, protocol string) (Server, error) { switch protocol { case "tcp": return server.NewServer(cfg) case "udp": return server.NewUDPServer(cfg) case "websocket", "ws", "wss": return server.NewWebSocketServer(cfg) case "unix": return server.NewUnixServer(cfg) case "serial": return server.NewSerialServer(cfg) default: return nil, fmt.Errorf("unsupported transport protocol: %s", protocol) } } // newServerByAddr 根据地址前缀判断传输层协议 func newServerByAddr(cfg *Config) (Server, error) { addr := cfg.Addr if len(addr) >= 8 { if addr[:8] == "serial://" { return server.NewSerialServer(cfg) } } if len(addr) >= 7 { if addr[:7] == "serial:" { return server.NewSerialServer(cfg) } } if len(addr) >= 6 { if addr[:6] == "wss://" { return server.NewWebSocketServer(cfg) } } if len(addr) >= 5 { if addr[:5] == "ws://" { return server.NewWebSocketServer(cfg) } if addr[:5] == "udp://" { return server.NewUDPServer(cfg) } if addr[:5] == "unix:" { return server.NewUnixServer(cfg) } } // 默认使用TCP服务器 return server.NewServer(cfg) } // Config 配置类型别名 type Config = config.Config // TLSConfig TLS配置类型别名 type TLSConfig = config.TLSConfig // LoggerConfig 日志配置类型别名 type LoggerConfig = config.LoggerConfig // MetricsConfig Metrics配置类型别名 type MetricsConfig = config.MetricsConfig // SessionConfig Session配置类型别名 type SessionConfig = config.SessionConfig // CodecConfig 编解码器配置类型别名 type CodecConfig = config.CodecConfig // NewTCPServer 创建TCP服务器 func NewTCPServer(cfg *Config) (Server, error) { return server.NewServer(cfg) } // NewUDPServer 创建UDP服务器 func NewUDPServer(cfg *Config) (Server, error) { return server.NewUDPServer(cfg) } // NewWebSocketServer 创建WebSocket服务器 func NewWebSocketServer(cfg *Config) (Server, error) { return server.NewWebSocketServer(cfg) } // NewUnixServer 创建Unix Domain Socket服务器 func NewUnixServer(cfg *Config) (Server, error) { return server.NewUnixServer(cfg) } // NewSerialServer 创建串口服务器 func NewSerialServer(cfg *Config) (Server, error) { return server.NewSerialServer(cfg) }