mirror of
https://github.com/MatrixSeven/file-transfer-go.git
synced 2026-02-04 03:25:03 +08:00
feat:桌面共享UI/逻辑优化
This commit is contained in:
@@ -14,6 +14,16 @@ import (
|
||||
type Config struct {
|
||||
Port int
|
||||
FrontendDir string
|
||||
TurnConfig TurnConfig
|
||||
}
|
||||
|
||||
// TurnConfig TURN服务器配置
|
||||
type TurnConfig struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
Port int `json:"port"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Realm string `json:"realm"`
|
||||
}
|
||||
|
||||
// loadEnvFile 加载环境变量文件
|
||||
@@ -64,6 +74,11 @@ func showHelp() {
|
||||
fmt.Println(" 环境变量:")
|
||||
fmt.Println(" PORT=8080 - 服务器监听端口")
|
||||
fmt.Println(" FRONTEND_DIR=/path - 外部前端文件目录 (可选)")
|
||||
fmt.Println(" TURN_ENABLED=true - 启用TURN服务器")
|
||||
fmt.Println(" TURN_PORT=3478 - TURN服务器端口")
|
||||
fmt.Println(" TURN_USERNAME=user - TURN服务器用户名")
|
||||
fmt.Println(" TURN_PASSWORD=pass - TURN服务器密码")
|
||||
fmt.Println(" TURN_REALM=localhost - TURN服务器域")
|
||||
fmt.Println(" 命令行参数:")
|
||||
flag.PrintDefaults()
|
||||
fmt.Println("")
|
||||
@@ -73,6 +88,7 @@ func showHelp() {
|
||||
fmt.Println(" ./file-transfer-server")
|
||||
fmt.Println(" ./file-transfer-server -port 3000")
|
||||
fmt.Println(" PORT=8080 FRONTEND_DIR=./dist ./file-transfer-server")
|
||||
fmt.Println(" TURN_ENABLED=true TURN_PORT=3478 ./file-transfer-server")
|
||||
}
|
||||
|
||||
// loadConfig 加载应用配置
|
||||
@@ -90,6 +106,27 @@ func loadConfig() *Config {
|
||||
}
|
||||
}
|
||||
|
||||
// TURN 配置默认值
|
||||
turnEnabled := os.Getenv("TURN_ENABLED") == "true"
|
||||
turnPort := 3478
|
||||
if envTurnPort := os.Getenv("TURN_PORT"); envTurnPort != "" {
|
||||
if port, err := strconv.Atoi(envTurnPort); err == nil {
|
||||
turnPort = port
|
||||
}
|
||||
}
|
||||
turnUsername := os.Getenv("TURN_USERNAME")
|
||||
if turnUsername == "" {
|
||||
turnUsername = "chuan"
|
||||
}
|
||||
turnPassword := os.Getenv("TURN_PASSWORD")
|
||||
if turnPassword == "" {
|
||||
turnPassword = "chuan123"
|
||||
}
|
||||
turnRealm := os.Getenv("TURN_REALM")
|
||||
if turnRealm == "" {
|
||||
turnRealm = "localhost"
|
||||
}
|
||||
|
||||
// 定义命令行参数
|
||||
var port = flag.Int("port", defaultPort, "服务器监听端口 (可通过 PORT 环境变量设置)")
|
||||
var help = flag.Bool("help", false, "显示帮助信息")
|
||||
@@ -104,6 +141,13 @@ func loadConfig() *Config {
|
||||
config := &Config{
|
||||
Port: *port,
|
||||
FrontendDir: os.Getenv("FRONTEND_DIR"),
|
||||
TurnConfig: TurnConfig{
|
||||
Enabled: turnEnabled,
|
||||
Port: turnPort,
|
||||
Username: turnUsername,
|
||||
Password: turnPassword,
|
||||
Realm: turnRealm,
|
||||
},
|
||||
}
|
||||
|
||||
return config
|
||||
@@ -121,4 +165,14 @@ func logConfig(config *Config) {
|
||||
} else {
|
||||
log.Printf("📦 使用内嵌前端文件")
|
||||
}
|
||||
|
||||
// 记录 TURN 配置信息
|
||||
if config.TurnConfig.Enabled {
|
||||
log.Printf("🔄 TURN服务器已启用")
|
||||
log.Printf(" 端口: %d", config.TurnConfig.Port)
|
||||
log.Printf(" 用户名: %s", config.TurnConfig.Username)
|
||||
log.Printf(" 域: %s", config.TurnConfig.Realm)
|
||||
} else {
|
||||
log.Printf("❌ TURN服务器已禁用")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,8 @@ func main() {
|
||||
logConfig(config)
|
||||
|
||||
// 设置路由
|
||||
router := setupRouter()
|
||||
routerSetup := setupRouter(config)
|
||||
|
||||
// 运行服务器(包含启动和优雅关闭)
|
||||
RunServer(config, router)
|
||||
RunServer(config, routerSetup)
|
||||
}
|
||||
|
||||
@@ -11,8 +11,14 @@ import (
|
||||
"github.com/go-chi/cors"
|
||||
)
|
||||
|
||||
// RouterSetup 路由设置结果
|
||||
type RouterSetup struct {
|
||||
Handler *handlers.Handler
|
||||
Router http.Handler
|
||||
}
|
||||
|
||||
// setupRouter 设置路由和中间件
|
||||
func setupRouter() http.Handler {
|
||||
func setupRouter(config *Config) *RouterSetup {
|
||||
// 初始化处理器
|
||||
h := handlers.NewHandler()
|
||||
|
||||
@@ -22,12 +28,15 @@ func setupRouter() http.Handler {
|
||||
setupMiddleware(router)
|
||||
|
||||
// 设置API路由
|
||||
setupAPIRoutes(router, h)
|
||||
setupAPIRoutes(router, h, config)
|
||||
|
||||
// 设置前端路由
|
||||
router.Handle("/*", web.CreateFrontendHandler())
|
||||
|
||||
return router
|
||||
return &RouterSetup{
|
||||
Handler: h,
|
||||
Router: router,
|
||||
}
|
||||
}
|
||||
|
||||
// setupMiddleware 设置中间件
|
||||
@@ -48,11 +57,20 @@ func setupMiddleware(r *chi.Mux) {
|
||||
}
|
||||
|
||||
// setupAPIRoutes 设置API路由
|
||||
func setupAPIRoutes(r *chi.Mux, h *handlers.Handler) {
|
||||
func setupAPIRoutes(r *chi.Mux, h *handlers.Handler, config *Config) {
|
||||
// WebRTC信令WebSocket路由
|
||||
r.Get("/api/ws/webrtc", h.HandleWebRTCWebSocket)
|
||||
|
||||
// WebRTC房间API
|
||||
r.Post("/api/create-room", h.CreateRoomHandler)
|
||||
r.Get("/api/room-info", h.WebRTCRoomStatusHandler)
|
||||
|
||||
// TURN服务器API(仅在启用时可用)
|
||||
if config.TurnConfig.Enabled {
|
||||
r.Get("/api/turn/stats", h.TurnStatsHandler)
|
||||
r.Get("/api/turn/config", h.TurnConfigHandler)
|
||||
}
|
||||
|
||||
// 管理API
|
||||
r.Get("/api/admin/status", h.AdminStatusHandler)
|
||||
}
|
||||
|
||||
@@ -9,30 +9,56 @@ import (
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"chuan/internal/services"
|
||||
)
|
||||
|
||||
// Server 服务器结构
|
||||
type Server struct {
|
||||
httpServer *http.Server
|
||||
config *Config
|
||||
httpServer *http.Server
|
||||
config *Config
|
||||
turnService *services.TurnService
|
||||
}
|
||||
|
||||
// NewServer 创建新的服务器实例
|
||||
func NewServer(config *Config, handler http.Handler) *Server {
|
||||
return &Server{
|
||||
func NewServer(config *Config, routerSetup *RouterSetup) *Server {
|
||||
server := &Server{
|
||||
httpServer: &http.Server{
|
||||
Addr: fmt.Sprintf(":%d", config.Port),
|
||||
Handler: handler,
|
||||
Handler: routerSetup.Router,
|
||||
ReadTimeout: 30 * time.Second,
|
||||
WriteTimeout: 30 * time.Second,
|
||||
IdleTimeout: 120 * time.Second,
|
||||
},
|
||||
config: config,
|
||||
}
|
||||
|
||||
// 如果启用了TURN服务器,创建TURN服务实例
|
||||
if config.TurnConfig.Enabled {
|
||||
turnConfig := services.TurnServiceConfig{
|
||||
Port: config.TurnConfig.Port,
|
||||
Username: config.TurnConfig.Username,
|
||||
Password: config.TurnConfig.Password,
|
||||
Realm: config.TurnConfig.Realm,
|
||||
}
|
||||
server.turnService = services.NewTurnService(turnConfig)
|
||||
|
||||
// 将TURN服务设置到处理器中
|
||||
routerSetup.Handler.SetTurnService(server.turnService)
|
||||
}
|
||||
|
||||
return server
|
||||
}
|
||||
|
||||
// Start 启动服务器
|
||||
func (s *Server) Start() error {
|
||||
// 启动TURN服务器(如果启用)
|
||||
if s.turnService != nil {
|
||||
if err := s.turnService.Start(); err != nil {
|
||||
return fmt.Errorf("启动TURN服务器失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("🚀 服务器启动在端口 :%d", s.config.Port)
|
||||
return s.httpServer.ListenAndServe()
|
||||
}
|
||||
@@ -40,6 +66,14 @@ func (s *Server) Start() error {
|
||||
// Stop 停止服务器
|
||||
func (s *Server) Stop(ctx context.Context) error {
|
||||
log.Println("🛑 正在关闭服务器...")
|
||||
|
||||
// 停止TURN服务器(如果启用)
|
||||
if s.turnService != nil {
|
||||
if err := s.turnService.Stop(); err != nil {
|
||||
log.Printf("⚠️ 停止TURN服务器失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return s.httpServer.Shutdown(ctx)
|
||||
}
|
||||
|
||||
@@ -62,8 +96,8 @@ func (s *Server) WaitForShutdown() {
|
||||
}
|
||||
|
||||
// RunServer 运行服务器(包含启动和优雅关闭)
|
||||
func RunServer(config *Config, handler http.Handler) {
|
||||
server := NewServer(config, handler)
|
||||
func RunServer(config *Config, routerSetup *RouterSetup) {
|
||||
server := NewServer(config, routerSetup)
|
||||
|
||||
// 启动服务器
|
||||
go func() {
|
||||
|
||||
Reference in New Issue
Block a user