ws_server.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package router
  2. import (
  3. "encoding/base64"
  4. "errors"
  5. "log"
  6. "net/http"
  7. "runtime"
  8. jsoniter "github.com/json-iterator/go"
  9. "github.com/sirupsen/logrus"
  10. "gogs.daxia.dev/huanan/pkg.daxia.dev/encrypt"
  11. "nn.daxia.dev/game/qznn"
  12. "nn.daxia.dev/handler/api"
  13. "nn.daxia.dev/model"
  14. "github.com/gorilla/websocket"
  15. )
  16. //TODO:限制重复链接的问题
  17. type BaseReq struct {
  18. Type string `json:"type"`
  19. }
  20. var upgrader = websocket.Upgrader{
  21. ReadBufferSize: 1024,
  22. WriteBufferSize: 5096,
  23. // 解决跨域问题
  24. CheckOrigin: func(r *http.Request) bool {
  25. return true
  26. },
  27. }
  28. func Index(w http.ResponseWriter, r *http.Request) {
  29. defer func() {
  30. if err := recover(); err != nil {
  31. logrus.Error(err)
  32. buf := make([]byte, 2048*5)
  33. n := runtime.Stack(buf, false)
  34. stackInfo := string(buf[:n])
  35. logrus.Errorf("panic stack info %s", stackInfo)
  36. }
  37. }()
  38. var err error
  39. c, err := upgrader.Upgrade(w, r, nil)
  40. if err != nil {
  41. log.Print("upgrade:", err)
  42. return
  43. }
  44. defer c.Close()
  45. debugAuth := r.URL.Query().Get("debug_auth")
  46. aesKey := model.AESKey
  47. if debugAuth == model.DebugStr {
  48. aesKey = nil
  49. }
  50. var ctx map[string]interface{}
  51. for {
  52. err = func() error {
  53. defer func() {
  54. if err := recover(); err != nil {
  55. logrus.Error(err)
  56. buf := make([]byte, 2048*5)
  57. n := runtime.Stack(buf, false)
  58. stackInfo := string(buf[:n])
  59. logrus.Errorf("panic stack info %s", stackInfo)
  60. }
  61. }()
  62. _, message, err := c.ReadMessage()
  63. if err != nil {
  64. logrus.Error("read:", err)
  65. return err
  66. }
  67. baseReq, message, err := parseMsg(message, aesKey)
  68. if err != nil {
  69. logrus.Error(err)
  70. return err
  71. }
  72. if baseReq.Type != "ping" {
  73. logrus.Infof("new msg income:%s", baseReq.Type)
  74. }
  75. switch baseReq.Type {
  76. case "perform":
  77. err = api.Perform(c, message, ctx)
  78. case "ping":
  79. err = api.GamePingMessage(c, message, ctx)
  80. case "connect":
  81. ctx, err = GameAuthMiddleware(c, message, api.GameConnect)
  82. case "disconnect":
  83. api.GameDisconnect(c, nil, ctx)
  84. return errors.New("disconnect")
  85. }
  86. if err != nil {
  87. logrus.Error(err, " 消息:", string(message))
  88. return nil
  89. }
  90. userModelI, exists := ctx["userModel"]
  91. if exists {
  92. userModel := userModelI.(model.User)
  93. if !qznn.UserIsOnline(userModel.ID) {
  94. return errors.New("用户掉线")
  95. }
  96. }
  97. return nil
  98. }()
  99. if err != nil {
  100. logrus.Infof("close: %v, err:%s", ctx, err.Error())
  101. break
  102. }
  103. }
  104. api.GameDisconnect(c, nil, ctx)
  105. }
  106. func parseMsg(message, aesKey []byte) (*BaseReq, []byte, error) {
  107. decBodyStr := string(message)
  108. if aesKey != nil {
  109. decBody, err := base64.StdEncoding.DecodeString(string(decBodyStr))
  110. if err != nil {
  111. logrus.Error(err, ":", string(decBodyStr))
  112. return nil, nil, err
  113. }
  114. decBody, err = encrypt.AesDecrypt(decBody, aesKey)
  115. if err != nil {
  116. logrus.Error(err)
  117. return nil, nil, err
  118. }
  119. decBodyStr = string(decBody)
  120. }
  121. baseReq := BaseReq{}
  122. err := jsoniter.Unmarshal([]byte(decBodyStr), &baseReq)
  123. if err != nil {
  124. return nil, nil, err
  125. }
  126. return &baseReq, []byte(decBodyStr), nil
  127. }