slowwildwshandler.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package handler
  2. import (
  3. "net/http"
  4. "slowwildws/internal/logic"
  5. "slowwildws/internal/server"
  6. "slowwildws/internal/svc"
  7. "github.com/gorilla/websocket"
  8. xhttp "github.com/zeromicro/x/http"
  9. )
  10. func SlowwildwsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  11. return func(w http.ResponseWriter, r *http.Request) {
  12. var responseHeader http.Header
  13. if protocol := r.Header.Get("Sec-Websocket-Protocol"); protocol != "" {
  14. responseHeader = http.Header{
  15. "Sec-Websocket-Protocol": []string{protocol},
  16. }
  17. }
  18. upgrade := websocket.Upgrader{
  19. CheckOrigin: func(r *http.Request) bool {
  20. return true
  21. },
  22. }
  23. conn, err := upgrade.Upgrade(w, r, responseHeader)
  24. if err != nil {
  25. xhttp.JsonBaseResponseCtx(r.Context(), w, err)
  26. return
  27. }
  28. // 初始化一个连接服务
  29. connServer := svcCtx.WsServer.InitConn(r.Context(), conn, svcCtx.Config)
  30. // 添加连接信息到连接池
  31. svcCtx.WsServer.AddConn(connServer, r.Context())
  32. // 开启协程校验心跳,保持连接
  33. go connServer.Keepalive()
  34. // 开启协程处理消息
  35. go func(svcCtx *svc.ServiceContext, r *http.Request, connServer *server.ConnectionServer) {
  36. l := logic.NewConnectionLogic(r.Context(), svcCtx)
  37. l.HandlerConn(connServer)
  38. }(svcCtx, r, connServer)
  39. }
  40. }