Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

114 lines
2.5KB

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/brianvoe/gofakeit/v6"
  6. "github.com/gorilla/websocket"
  7. log "github.com/sirupsen/logrus"
  8. "net/http"
  9. "time"
  10. )
  11. // We'll need to define an upgradeToWs
  12. // this will require a Read and Write buffer size
  13. var upgradeToWs = websocket.Upgrader{
  14. ReadBufferSize: 1024,
  15. WriteBufferSize: 1024,
  16. }
  17. func apiV1WebSocketHandler(w http.ResponseWriter, r *http.Request) {
  18. upgradeToWs.CheckOrigin = func(r *http.Request) bool { return true }
  19. ws, err := upgradeToWs.Upgrade(w, r, nil)
  20. if err != nil {
  21. log.Println("cannot upgrade websocket", err)
  22. return
  23. }
  24. mid := apiV1GetMachineId(r)
  25. wsq.MapMidToConnection(mid, ws)
  26. // helpful log statement to show connections
  27. log.Println("Websocket Api/V1: Client Connected", mid)
  28. wsReader(ws)
  29. }
  30. func wsReader(conn *websocket.Conn) {
  31. wsq.addConnection(conn)
  32. for {
  33. stillExist := wsq.has(conn)
  34. if !stillExist {
  35. return // the connection has been removed.
  36. }
  37. // read in a message
  38. messageType, p, err := conn.ReadMessage()
  39. if err != nil {
  40. wsq.del(conn)
  41. log.Println(err)
  42. return
  43. }
  44. // print out that message for clarity
  45. // fmt.Println(string(p))
  46. if err := conn.WriteMessage(messageType, p); err != nil {
  47. wsq.del(conn)
  48. log.Println(err)
  49. return
  50. }
  51. if string(p) == "send dummy string for 500 times" {
  52. go wsDummySender(conn)
  53. }
  54. }
  55. }
  56. func WsBroadCast(msg string) {
  57. wsq.wsDoBroadcast(msg, "")
  58. }
  59. func WsSend(To string, msg map[string]string) {
  60. b, e := json.Marshal(msg)
  61. if e != nil {
  62. log.Error("cannot broadcast websocket message, cannot convert to json", msg)
  63. }
  64. conn := wsq.getConnBySessionId(To)
  65. if conn != nil {
  66. err := conn.WriteMessage(websocket.TextMessage, b)
  67. if err != nil {
  68. wsq.del(conn)
  69. }
  70. }
  71. }
  72. func WsBroadCastExceptMe(me string, msg map[string]string) {
  73. b, e := json.Marshal(msg)
  74. if e == nil {
  75. wsq.wsDoBroadcast(string(b), me)
  76. }
  77. }
  78. func wsDummySender(conn *websocket.Conn) {
  79. //write subsequent 5 copies, each after 1 second
  80. log.Info("start sending server data to client ..")
  81. p := "dummy string from server "
  82. for i := 1; i < 500; i++ {
  83. time.Sleep(1 * time.Second)
  84. //msg := fmt.Sprintf("copy %d, %s, %s", i, p, wsDummyString()) // 4M long string no issue
  85. msg := fmt.Sprintf("copy %d, %s ", i, p)
  86. log.Info("dummy sender is working, ", msg)
  87. if err := conn.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil {
  88. log.Println("wsDummySender stopped on error: ", err)
  89. return
  90. }
  91. }
  92. }
  93. func wsDummyString() string {
  94. s := gofakeit.LetterN(4096000) // 4M
  95. return s
  96. }