|
|
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)
|
|
|
}
|