From: qydysky Date: Tue, 2 Feb 2021 13:05:50 +0000 (+0800) Subject: websocket改进 X-Git-Tag: v0.3.10 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=99c9ea061084d8e593310f7006d211580bf1166a;p=part%2F.git websocket改进 --- diff --git a/websocket/Server.go b/websocket/Server.go index e02374e..6946417 100644 --- a/websocket/Server.go +++ b/websocket/Server.go @@ -26,7 +26,7 @@ func New_server() (*Server) { } } -func (t *Server) WS(w http.ResponseWriter, r *http.Request) { +func (t *Server) WS(w http.ResponseWriter, r *http.Request) (o chan uintptr) { upgrader := websocket.Upgrader{} ws, err := upgrader.Upgrade(w, r, nil) @@ -34,11 +34,11 @@ func (t *Server) WS(w http.ResponseWriter, r *http.Request) { t.ws_mq.Push_tag(`error`,err) return } - defer ws.Close() + + o = make(chan uintptr,1) //从池中获取本会话id User := t.userpool.Get() - defer t.userpool.Put(User) //发送 @@ -61,26 +61,38 @@ func (t *Server) WS(w http.ResponseWriter, r *http.Request) { }) //接收 - for { - 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 + go func(){ + for { + 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 + } else { + t.ws_mq.Push_tag(`error`,err) + } + t.ws_mq.Push_tag(`close`,Uinterface{ + Id:User.Id, + }) + break } else { - t.ws_mq.Push_tag(`error`,err) + t.ws_mq.Push_tag(`recv`,Uinterface{ + Id:User.Id, + Data:message, + }) } - t.ws_mq.Push_tag(`close`,Uinterface{ - Id:User.Id, - }) - break - } else { - t.ws_mq.Push_tag(`recv`,Uinterface{ - Id:User.Id, - Data:message, - }) } - } + + //归还 + t.userpool.Put(User) + //结束 + ws.Close() + //通知上层结束,上层使用通道传出阻塞 + close(o) + }() + //通知上层本此会话的id + o <- User.Id + return } //how to use diff --git a/websocket/Server_test.go b/websocket/Server_test.go index fcf1743..ec86c05 100644 --- a/websocket/Server_test.go +++ b/websocket/Server_test.go @@ -15,7 +15,8 @@ func Test_Server(t *testing.T) { ws_mq.Pull_tag(map[string]func(interface{})(bool){ `recv`:func(data interface{})(bool){ if tmp,ok := data.(Uinterface);ok { - t.Log(tmp.Id,string(tmp.Data)) + 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, @@ -30,7 +31,11 @@ func Test_Server(t *testing.T) { open.Run("http://"+w.Server.Addr) w.Handle(map[string]func(http.ResponseWriter,*http.Request){ `/ws`:func(w http.ResponseWriter,r *http.Request){ - s.WS(w,r) + conn := s.WS(w,r) + id :=<- conn + t.Log(`user connect!`,id) + <- conn + t.Log(`user disconnect!`,id) }, }) time.Sleep(time.Second*time.Duration(100))