]> 127.0.0.1 Git - part/.git/commitdiff
websocket改进 v0.3.10
authorqydysky <qydysky@foxmail.com>
Tue, 2 Feb 2021 13:05:50 +0000 (21:05 +0800)
committerqydysky <qydysky@foxmail.com>
Tue, 2 Feb 2021 13:05:50 +0000 (21:05 +0800)
websocket/Server.go
websocket/Server_test.go

index e02374ecd906e3152abfed0b116024b6b05919ab..69464171a52b5cd5a610c3afc03faf5ab792745d 100644 (file)
@@ -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
index fcf1743b882c96f050dd8ff4f0a522feaaa16a99..ec86c057212ec2131f95eeab2dbce09778add82a 100644 (file)
@@ -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))