chatcontroller.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package controller
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gorilla/websocket"
  7. "net/http"
  8. "strconv"
  9. "trading-go/model"
  10. "trading-go/response"
  11. )
  12. var UP = websocket.Upgrader{
  13. ReadBufferSize: 1024,
  14. WriteBufferSize: 1024,
  15. }
  16. type client struct {
  17. conn *websocket.Conn
  18. pip chan *model.Message
  19. }
  20. var Conns map[uint]*client
  21. func init() {
  22. Conns = make(map[uint]*client)
  23. }
  24. // 发送消息
  25. func send(conn *websocket.Conn, uid uint) {
  26. pip := Conns[uid].pip
  27. defer func() {
  28. delete(Conns, uid)
  29. }()
  30. for {
  31. data := <-pip
  32. msg, err := json.Marshal(data)
  33. if err != nil {
  34. fmt.Println("link closed")
  35. break
  36. }
  37. err = conn.WriteMessage(data.MsgType, msg)
  38. if err != nil {
  39. fmt.Println(err.Error())
  40. break
  41. }
  42. }
  43. }
  44. // 接收消息
  45. func reception(conn *websocket.Conn, uid uint) {
  46. defer func() {
  47. delete(Conns, uid)
  48. }()
  49. for {
  50. var msg model.Message
  51. err := conn.ReadJSON(&msg)
  52. if err != nil {
  53. fmt.Println(err.Error())
  54. break
  55. }
  56. if v, ok := Conns[msg.To]; ok {
  57. v.pip <- &msg
  58. } else {
  59. }
  60. }
  61. }
  62. func broadcast(data model.Message) {
  63. for _, conn := range Conns {
  64. msg, err := json.Marshal(data)
  65. if err != nil {
  66. fmt.Println(err.Error())
  67. break
  68. }
  69. err = conn.conn.WriteMessage(data.MsgType, msg)
  70. if err != nil {
  71. fmt.Println(err.Error())
  72. break
  73. }
  74. }
  75. }
  76. func Chat(w http.ResponseWriter, rq *http.Request, uid uint) {
  77. // 升级为websocket
  78. conn, err := UP.Upgrade(w, rq, nil)
  79. if err != nil {
  80. response.Fail(w, err.Error(), http.StatusUpgradeRequired)
  81. return
  82. }
  83. pip := make(chan *model.Message, 1024)
  84. client := client{
  85. conn: conn,
  86. pip: pip,
  87. }
  88. Conns[uid] = &client
  89. go send(conn, uid)
  90. go reception(conn, uid)
  91. response.Success(w, "success", nil)
  92. }
  93. // LinkToServer
  94. // @Tags 聊天模块
  95. // @Summary 与服务端进行websocket连接,请使用postman测试
  96. // @Success 200 {object} response.Response
  97. // @Router /chat [get]
  98. func LinkToServer(c *gin.Context) {
  99. uid, err := strconv.Atoi(c.Query("uid"))
  100. if err != nil {
  101. response.Fail(c.Writer, "failed", 500)
  102. return
  103. }
  104. Chat(c.Writer, c.Request, uint(uid))
  105. }