From fab34e1f0350b38a16a909e14a0fef8d5569a55c Mon Sep 17 00:00:00 2001 From: qydysky Date: Fri, 19 Feb 2021 15:51:13 +0800 Subject: [PATCH] =?utf8?q?websocket=E6=9C=8D=E5=8A=A1=E4=B8=BB=E5=8A=A8?= =?utf8?q?=E5=85=B3=E9=97=AD=E8=BF=9E=E6=8E=A5=20=E4=BF=AE=E5=A4=8Dwebsock?= =?utf8?q?et=E8=8E=B7=E5=8F=96=E4=B8=8D=E5=88=B0error=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- signal/Signal.go | 8 ++++---- websocket/Server.go | 30 +++++++++++++++++++++++------- websocket/Server_test.go | 23 +++++++++++++++++++---- websocket/index.html | 7 +++++-- 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/signal/Signal.go b/signal/Signal.go index 60ae4d8..8180acb 100644 --- a/signal/Signal.go +++ b/signal/Signal.go @@ -19,10 +19,10 @@ func (i *Signal) Done() { func (i *Signal) Islive() (islive bool) { if i == nil {return} select { - case <-i.Chan:; - default: - if i.Chan == nil {break} - islive = true + case <-i.Chan:;//close + default://still alive + if i.Chan == nil {break}//not make yet + islive = true//has made } return } \ No newline at end of file diff --git a/websocket/Server.go b/websocket/Server.go index 6946417..7e78964 100644 --- a/websocket/Server.go +++ b/websocket/Server.go @@ -19,6 +19,11 @@ type Uinterface struct { Data []byte } +type uinterface struct {//内部消息 + Id uintptr + Data interface{} +} + func New_server() (*Server) { return &Server{ ws_mq: mq.New(200),//收发通道 @@ -40,7 +45,6 @@ func (t *Server) WS(w http.ResponseWriter, r *http.Request) (o chan uintptr) { //从池中获取本会话id User := t.userpool.Get() - //发送 t.ws_mq.Pull_tag(map[string]func(interface{})(bool){ `send`:func(data interface{})(bool){ @@ -53,8 +57,16 @@ func (t *Server) WS(w http.ResponseWriter, r *http.Request) (o chan uintptr) { return false }, `close`:func(data interface{})(bool){ - if u,ok := data.(Uinterface);ok && u.Id == 0 || u.Id == User.Id{ + if u,ok := data.(Uinterface);ok && u.Id == 0 || u.Id == User.Id{//服务器主动关闭 + msg := websocket.FormatCloseMessage(websocket.CloseNormalClosure, string(u.Data)) + TO := time.Now().Add(time.Second*time.Duration(5)) + + if err := ws.WriteControl(websocket.CloseMessage, msg, TO);err != nil { + t.ws_mq.Push_tag(`error`,err) + } return true + } else if u,ok := data.(uinterface);ok{//接收发生错误关闭 + return ok && u.Data.(string) == `rev_close` && u.Id == 0 || u.Id == User.Id } return false }, @@ -66,14 +78,13 @@ func (t *Server) WS(w http.ResponseWriter, r *http.Request) (o chan uintptr) { ws.SetReadDeadline(time.Now().Add(time.Second*time.Duration(300))) if _, message, err := ws.ReadMessage();err != nil { if websocket.IsCloseError(err,websocket.CloseGoingAway) { - } else if err,ok := err.(net.Error);ok && err.Timeout() { - //Timeout , js will reload html + //client close + } else if e,ok := err.(net.Error);ok && e.Timeout() { + //Timeout } else { + //other t.ws_mq.Push_tag(`error`,err) } - t.ws_mq.Push_tag(`close`,Uinterface{ - Id:User.Id, - }) break } else { t.ws_mq.Push_tag(`recv`,Uinterface{ @@ -83,6 +94,11 @@ func (t *Server) WS(w http.ResponseWriter, r *http.Request) (o chan uintptr) { } } + //接收发生错误,通知发送关闭 + t.ws_mq.Push_tag(`close`,uinterface{ + Id:User.Id, + Data:`rev_close`, + }) //归还 t.userpool.Put(User) //结束 diff --git a/websocket/Server_test.go b/websocket/Server_test.go index ec86c05..f865048 100644 --- a/websocket/Server_test.go +++ b/websocket/Server_test.go @@ -1,6 +1,7 @@ package part import ( + "strconv" "testing" "net/http" "time" @@ -11,16 +12,30 @@ import ( func Test_Server(t *testing.T) { s := New_server() { + num := 5 + ws_mq := s.Interface() ws_mq.Pull_tag(map[string]func(interface{})(bool){ + `error`:func(data interface{})(bool){ + t.Log(data) + return false + }, `recv`:func(data interface{})(bool){ if tmp,ok := data.(Uinterface);ok { t.Log(tmp.Id, `=>`,string(tmp.Data)) t.Log(string(tmp.Data), `=>`,tmp.Id) - ws_mq.Push_tag(`send`,Uinterface{//just reply - Id:tmp.Id, - Data:tmp.Data, - }) + num -= 1 + if num > 0 { + ws_mq.Push_tag(`send`,Uinterface{//just reply + Id:tmp.Id, + Data:append(tmp.Data,[]byte(` get.server:close after `+strconv.Itoa(num)+` s`)...), + }) + } else { + ws_mq.Push_tag(`close`,Uinterface{//close + Id:tmp.Id, + Data:[]byte(`closeNormal`), + }) + } } return false }, diff --git a/websocket/index.html b/websocket/index.html index 5a42ca7..a436f85 100644 --- a/websocket/index.html +++ b/websocket/index.html @@ -13,15 +13,18 @@