feat: server.New 支持通过 server.WithWebsocketReadDeadline 设置超时时间
This commit is contained in:
parent
ee87612f60
commit
2513714ac4
|
@ -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 确定分流通道
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package times
|
||||
|
||||
import "time"
|
||||
|
||||
var (
|
||||
Zero time.Time // 零值时间
|
||||
)
|
Loading…
Reference in New Issue