From 6b38c7dbc158ff68c47ccb8bd07282cad628a255 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 9 May 2023 18:14:05 +0800 Subject: [PATCH] =?UTF-8?q?websocket=E6=94=AF=E6=8C=81=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/errors.go | 21 ++++++++++++--------- server/event.go | 30 +++++++++++++++++++++++++----- server/message.go | 17 +++++++++++++++++ server/server.go | 11 ++++++++--- 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/server/errors.go b/server/errors.go index cb82bbe..4002ed8 100644 --- a/server/errors.go +++ b/server/errors.go @@ -3,13 +3,16 @@ package server import "errors" var ( - ErrConstructed = errors.New("the Server must be constructed using the server.New function") - ErrCanNotSupportNetwork = errors.New("can not support network") - ErrMessageTypePacketAttrs = errors.New("MessageTypePacket must contain *Conn and []byte") - ErrMessageTypeErrorAttrs = errors.New("MessageTypePacket must contain error and MessageErrorAction") - ErrNetworkOnlySupportHttp = errors.New("the current network mode is not compatible with HttpRouter, only NetworkHttp is supported") - ErrNetworkIncompatibleHttp = errors.New("the current network mode is not compatible with NetworkHttp") - ErrWebsocketMessageTypeException = errors.New("unknown message type, will not work") - ErrNotWebsocketUseMessageType = errors.New("message type filtering only supports websocket and does not take effect") - ErrWebsocketIllegalMessageType = errors.New("illegal message type") + ErrConstructed = errors.New("the Server must be constructed using the server.New function") + ErrCanNotSupportNetwork = errors.New("can not support network") + ErrMessageTypePacketAttrs = errors.New("MessageTypePacket must contain *Conn and []byte") + ErrWebsocketMessageTypePacketAttrs = errors.New("MessageTypePacket must contain *Conn and []byte and int(MessageType)") + ErrMessageTypeErrorAttrs = errors.New("MessageTypePacket must contain error and MessageErrorAction") + ErrNetworkOnlySupportHttp = errors.New("the current network mode is not compatible with HttpRouter, only NetworkHttp is supported") + ErrNetworkIncompatibleHttp = errors.New("the current network mode is not compatible with NetworkHttp") + ErrWebsocketMessageTypeException = errors.New("unknown message type, will not work") + ErrNotWebsocketUseMessageType = errors.New("message type filtering only supports websocket and does not take effect") + ErrWebsocketIllegalMessageType = errors.New("illegal message type") + ErrPleaseUseWebsocketHandle = errors.New("in Websocket mode, please use the RegConnectionReceiveWebsocketPacketEvent function to register") + ErrPleaseUseOrdinaryPacketHandle = errors.New("non Websocket mode, please use the RegConnectionReceivePacketEvent function to register") ) diff --git a/server/event.go b/server/event.go index 07eeaf1..2e81158 100644 --- a/server/event.go +++ b/server/event.go @@ -10,16 +10,18 @@ import ( type StartBeforeEventHandle func(srv *Server) type StartFinishEventHandle func(srv *Server) type ConnectionReceivePacketEventHandle func(srv *Server, conn *Conn, packet []byte) +type ConnectionReceiveWebsocketPacketEventHandle func(srv *Server, conn *Conn, packet []byte, messageType int) type ConnectionOpenedEventHandle func(srv *Server, conn *Conn) type ConnectionClosedEventHandle func(srv *Server, conn *Conn) type event struct { *Server - startBeforeEventHandles []StartBeforeEventHandle - startFinishEventHandles []StartFinishEventHandle - connectionReceivePacketEventHandles []ConnectionReceivePacketEventHandle - connectionOpenedEventHandles []ConnectionOpenedEventHandle - connectionClosedEventHandles []ConnectionClosedEventHandle + startBeforeEventHandles []StartBeforeEventHandle + startFinishEventHandles []StartFinishEventHandle + connectionReceivePacketEventHandles []ConnectionReceivePacketEventHandle + connectionReceiveWebsocketPacketEventHandles []ConnectionReceiveWebsocketPacketEventHandle + connectionOpenedEventHandles []ConnectionOpenedEventHandle + connectionClosedEventHandles []ConnectionClosedEventHandle } // RegStartBeforeEvent 在服务器初始化完成启动前立刻执行被注册的事件处理函数 @@ -83,6 +85,9 @@ func (slf *event) RegConnectionReceivePacketEvent(handle ConnectionReceivePacket if slf.network == NetworkHttp { panic(ErrNetworkIncompatibleHttp) } + if slf.network == NetworkWebsocket { + panic(ErrPleaseUseWebsocketHandle) + } slf.connectionReceivePacketEventHandles = append(slf.connectionReceivePacketEventHandles, handle) log.Info("Server", zap.String("RegEvent", runtimes.CurrentRunningFuncName()), zap.String("handle", reflect.TypeOf(handle).String())) } @@ -93,6 +98,21 @@ func (slf *event) OnConnectionReceivePacketEvent(conn *Conn, packet []byte) { } } +// RegConnectionReceiveWebsocketPacketEvent 在接收到Websocket数据包时将立刻执行被注册的事件处理函数 +func (slf *event) RegConnectionReceiveWebsocketPacketEvent(handle ConnectionReceiveWebsocketPacketEventHandle) { + if slf.network != NetworkWebsocket { + panic(ErrPleaseUseOrdinaryPacketHandle) + } + slf.connectionReceiveWebsocketPacketEventHandles = append(slf.connectionReceiveWebsocketPacketEventHandles, handle) + log.Info("Server", zap.String("RegEvent", runtimes.CurrentRunningFuncName()), zap.String("handle", reflect.TypeOf(handle).String())) +} + +func (slf *event) OnConnectionReceiveWebsocketPacketEvent(conn *Conn, packet []byte, messageType int) { + for _, handle := range slf.connectionReceiveWebsocketPacketEventHandles { + handle(slf.Server, conn, packet, messageType) + } +} + func (slf *event) check() { switch slf.network { case NetworkHttp, NetworkGRPC: diff --git a/server/message.go b/server/message.go index 490d5d7..d9da968 100644 --- a/server/message.go +++ b/server/message.go @@ -48,6 +48,23 @@ func (slf MessageType) String() string { return messageNames[slf] } +func (slf MessageType) deconstructWebSocketPacket(attrs ...any) (conn *Conn, packet []byte, messageType int) { + if len(attrs) != 3 { + panic(ErrWebsocketMessageTypePacketAttrs) + } + var ok bool + if conn, ok = attrs[0].(*Conn); !ok { + panic(ErrWebsocketMessageTypePacketAttrs) + } + if packet, ok = attrs[1].([]byte); !ok { + panic(ErrWebsocketMessageTypePacketAttrs) + } + if messageType, ok = attrs[2].(int); !ok { + panic(ErrWebsocketMessageTypePacketAttrs) + } + return +} + func (slf MessageType) deconstructPacket(attrs ...any) (conn *Conn, packet []byte) { if len(attrs) != 2 { panic(ErrMessageTypePacketAttrs) diff --git a/server/server.go b/server/server.go index cc6154b..9b179a6 100644 --- a/server/server.go +++ b/server/server.go @@ -236,7 +236,7 @@ func (slf *Server) Run(addr string) error { if !slf.supportMessageTypes[messageType] { panic(ErrWebsocketIllegalMessageType) } - slf.PushMessage(MessageTypePacket, conn, packet) + slf.PushMessage(MessageTypePacket, conn, packet, messageType) } }) go func() { @@ -341,8 +341,13 @@ func (slf *Server) dispatchMessage(msg *message) { }() switch msg.t { case MessageTypePacket: - conn, packet := msg.t.deconstructPacket(msg.attrs...) - slf.OnConnectionReceivePacketEvent(conn, packet) + if slf.network == NetworkWebsocket { + conn, packet, messageType := msg.t.deconstructWebSocketPacket(msg.attrs...) + slf.OnConnectionReceiveWebsocketPacketEvent(conn, packet, messageType) + } else { + conn, packet := msg.t.deconstructPacket(msg.attrs...) + slf.OnConnectionReceivePacketEvent(conn, packet) + } case MessageTypeError: err, action := msg.t.deconstructError(msg.attrs...) switch action {