chatcontroller.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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[int64]*client
  21. func init() {
  22. Conns = make(map[int64]*client)
  23. }
  24. // 发送消息
  25. func send(conn *websocket.Conn, uid int64) {
  26. pip := Conns[uid].pip
  27. defer func() {
  28. close(pip)
  29. conn.Close()
  30. delete(Conns, uid)
  31. }()
  32. for {
  33. data := <-pip
  34. msg, err := json.Marshal(data)
  35. if err != nil {
  36. fmt.Println("link closed")
  37. break
  38. }
  39. err = conn.WriteMessage(1, msg)
  40. if err != nil {
  41. fmt.Println(err.Error())
  42. continue
  43. }
  44. }
  45. }
  46. // 接收消息
  47. func reception(conn *websocket.Conn, uid int64) {
  48. pip := Conns[uid].pip
  49. defer func() {
  50. close(pip)
  51. conn.Close()
  52. delete(Conns, uid)
  53. }()
  54. for {
  55. var msg model.Message
  56. err := conn.ReadJSON(&msg)
  57. if err != nil {
  58. fmt.Println(err.Error())
  59. break
  60. }
  61. Conns[msg.To].pip <- &msg
  62. }
  63. }
  64. func Chat(w http.ResponseWriter, rq *http.Request, uid int64) {
  65. // 升级为websocket
  66. conn, err := UP.Upgrade(w, rq, nil)
  67. if err != nil {
  68. response.Fail(w, err.Error(), http.StatusUpgradeRequired)
  69. return
  70. }
  71. pip := make(chan *model.Message, 1024)
  72. client := client{
  73. conn: conn,
  74. pip: pip,
  75. }
  76. Conns[uid] = &client
  77. go send(conn, uid)
  78. go reception(conn, uid)
  79. response.Success(w, "success", nil)
  80. }
  81. func LinkToServer(c *gin.Context) {
  82. uid, err := strconv.Atoi(c.Query("uid"))
  83. if err != nil {
  84. response.Fail(c.Writer, "failed", 500)
  85. return
  86. }
  87. Chat(c.Writer, c.Request, int64(uid))
  88. }