You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
4.2 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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