当前位置:   article > 正文

golang websocket 手写研究机制

golang websocket 手写研究机制
  1. // 处理ws请求
  2. func WsHandler(w http.ResponseWriter, r *http.Request, id string) {
  3. var conn *websocket.Conn
  4. var err error
  5. pingTicker := time.NewTicker(time.Second * 10)
  6. conn, err = wsupgrader.Upgrade(w, r, nil)
  7. if err != nil {
  8. log.Printf("Failed to set websocket upgrade: %+v", err)
  9. return
  10. }
  11. addClient(id, conn)
  12. m, exist := getMessageChannel(id)
  13. if !exist {
  14. m = make(chan interface{})
  15. addMessageChannel(id, m)
  16. }
  17. conn.SetCloseHandler(func(code int, text string) error {
  18. deleteClient(id)
  19. fmt.Println(code)
  20. return nil
  21. })
  22. for {
  23. select {
  24. case content, ok := <-m:
  25. err = conn.WriteJSON(content)
  26. if err != nil {
  27. log.Println(err)
  28. if ok {
  29. go func() {
  30. m <- content
  31. }()
  32. }
  33. conn.Close()
  34. deleteClient(id)
  35. return
  36. }
  37. case <-pingTicker.C:
  38. conn.SetWriteDeadline(time.Now().Add(time.Second * 20))
  39. if err := conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil {
  40. log.Println("send ping err:", err)
  41. conn.Close()
  42. deleteClient(id)
  43. return
  44. }
  45. }
  46. }
  47. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号