diff --git a/server/options.go b/server/options.go index 9783360..fcecd2a 100644 --- a/server/options.go +++ b/server/options.go @@ -24,6 +24,18 @@ const ( type Option func(srv *Server) +// WithWebsocketReadDeadline 设置 Websocket 读取超时时间 +// - 默认: 30 * time.Second +// - 当 t <= 0 时,表示不设置超时时间 +func WithWebsocketReadDeadline(t time.Duration) Option { + return func(srv *Server) { + if srv.network != NetworkWebsocket { + return + } + srv.websocketReadDeadline = t + } +} + // WithDiversion 通过分流的方式创建服务器 // - diversion:分流函数,返回一个函数通道,用于接收分流的消息 // - 需要确保能够通过 conn 和 packet 确定分流通道 diff --git a/server/server.go b/server/server.go index d862339..4ef827f 100644 --- a/server/server.go +++ b/server/server.go @@ -9,6 +9,7 @@ import ( "github.com/kercylan98/minotaur/utils/super" "github.com/kercylan98/minotaur/utils/synchronization" "github.com/kercylan98/minotaur/utils/timer" + "github.com/kercylan98/minotaur/utils/times" "github.com/panjf2000/gnet" "github.com/panjf2000/gnet/pkg/logging" "github.com/xtaci/kcp-go/v5" @@ -37,14 +38,18 @@ func New(network Network, options ...Option) *Server { } server.event.Server = server - if network == NetworkHttp { + switch network { + case NetworkHttp: server.ginServer = gin.New() server.httpServer = &http.Server{ Handler: server.ginServer, } - } else if network == NetworkGRPC { + case NetworkGRPC: server.grpcServer = grpc.NewServer() + case NetworkWebsocket: + server.websocketReadDeadline = time.Second * 30 } + for _, option := range options { option(server) } @@ -81,6 +86,8 @@ type Server struct { ticker *timer.Ticker // 定时器 multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误 + + websocketReadDeadline time.Duration // websocket连接超时时间 } // Run 使用特定地址运行服务器 @@ -268,9 +275,8 @@ func (slf *Server) Run(addr string) error { slf.OnConnectionClosedEvent(conn, err) } }() - for { - if err := ws.SetReadDeadline(time.Now().Add(time.Second * 30)); err != nil { + if err := ws.SetReadDeadline(super.If(slf.websocketReadDeadline <= 0, times.Zero, time.Now().Add(slf.websocketReadDeadline))); err != nil { panic(err) } messageType, packet, readErr := ws.ReadMessage() diff --git a/utils/times/times.go b/utils/times/times.go new file mode 100644 index 0000000..204d5a1 --- /dev/null +++ b/utils/times/times.go @@ -0,0 +1,7 @@ +package times + +import "time" + +var ( + Zero time.Time // 零值时间 +)