}
}
-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)
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)
//发送
})
//接收
- 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
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,
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))