chatcontroller.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. 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 int64) {
  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 Chat(w http.ResponseWriter, rq *http.Request, uid int64) {
  63. // 升级为websocket
  64. conn, err := UP.Upgrade(w, rq, nil)
  65. if err != nil {
  66. response.Fail(w, err.Error(), http.StatusUpgradeRequired)
  67. return
  68. }
  69. pip := make(chan *model.Message, 1024)
  70. client := client{
  71. conn: conn,
  72. pip: pip,
  73. }
  74. Conns[uid] = &client
  75. go send(conn, uid)
  76. go reception(conn, uid)
  77. response.Success(w, "success", nil)
  78. }
  79. func LinkToServer(c *gin.Context) {
  80. uid, err := strconv.Atoi(c.Query("uid"))
  81. if err != nil {
  82. response.Fail(c.Writer, "failed", 500)
  83. return
  84. }
  85. Chat(c.Writer, c.Request, int64(uid))
  86. }