feat: server.New 支持通过 server.WithWebsocketReadDeadline 设置超时时间
This commit is contained in:
parent
ee87612f60
commit
2513714ac4
|
@ -24,6 +24,18 @@ const (
|
||||||
|
|
||||||
type Option func(srv *Server)
|
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 通过分流的方式创建服务器
|
// WithDiversion 通过分流的方式创建服务器
|
||||||
// - diversion:分流函数,返回一个函数通道,用于接收分流的消息
|
// - diversion:分流函数,返回一个函数通道,用于接收分流的消息
|
||||||
// - 需要确保能够通过 conn 和 packet 确定分流通道
|
// - 需要确保能够通过 conn 和 packet 确定分流通道
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/kercylan98/minotaur/utils/super"
|
"github.com/kercylan98/minotaur/utils/super"
|
||||||
"github.com/kercylan98/minotaur/utils/synchronization"
|
"github.com/kercylan98/minotaur/utils/synchronization"
|
||||||
"github.com/kercylan98/minotaur/utils/timer"
|
"github.com/kercylan98/minotaur/utils/timer"
|
||||||
|
"github.com/kercylan98/minotaur/utils/times"
|
||||||
"github.com/panjf2000/gnet"
|
"github.com/panjf2000/gnet"
|
||||||
"github.com/panjf2000/gnet/pkg/logging"
|
"github.com/panjf2000/gnet/pkg/logging"
|
||||||
"github.com/xtaci/kcp-go/v5"
|
"github.com/xtaci/kcp-go/v5"
|
||||||
|
@ -37,14 +38,18 @@ func New(network Network, options ...Option) *Server {
|
||||||
}
|
}
|
||||||
server.event.Server = server
|
server.event.Server = server
|
||||||
|
|
||||||
if network == NetworkHttp {
|
switch network {
|
||||||
|
case NetworkHttp:
|
||||||
server.ginServer = gin.New()
|
server.ginServer = gin.New()
|
||||||
server.httpServer = &http.Server{
|
server.httpServer = &http.Server{
|
||||||
Handler: server.ginServer,
|
Handler: server.ginServer,
|
||||||
}
|
}
|
||||||
} else if network == NetworkGRPC {
|
case NetworkGRPC:
|
||||||
server.grpcServer = grpc.NewServer()
|
server.grpcServer = grpc.NewServer()
|
||||||
|
case NetworkWebsocket:
|
||||||
|
server.websocketReadDeadline = time.Second * 30
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
option(server)
|
option(server)
|
||||||
}
|
}
|
||||||
|
@ -81,6 +86,8 @@ type Server struct {
|
||||||
ticker *timer.Ticker // 定时器
|
ticker *timer.Ticker // 定时器
|
||||||
|
|
||||||
multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误
|
multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误
|
||||||
|
|
||||||
|
websocketReadDeadline time.Duration // websocket连接超时时间
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run 使用特定地址运行服务器
|
// Run 使用特定地址运行服务器
|
||||||
|
@ -268,9 +275,8 @@ func (slf *Server) Run(addr string) error {
|
||||||
slf.OnConnectionClosedEvent(conn, err)
|
slf.OnConnectionClosedEvent(conn, err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
for {
|
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)
|
panic(err)
|
||||||
}
|
}
|
||||||
messageType, packet, readErr := ws.ReadMessage()
|
messageType, packet, readErr := ws.ReadMessage()
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package times
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
var (
|
||||||
|
Zero time.Time // 零值时间
|
||||||
|
)
|
Loading…
Reference in New Issue