Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

100 rindas
2.3KB

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gorilla/websocket"
  5. log "github.com/sirupsen/logrus"
  6. "net/http"
  7. "time"
  8. )
  9. const apiV1WebSocket = apiV1Prefix + "ws"
  10. // We'll need to define an upgradeToWs
  11. // this will require a Read and Write buffer size
  12. var upgradeToWs = websocket.Upgrader{
  13. ReadBufferSize: 1024,
  14. WriteBufferSize: 1024,
  15. }
  16. func apiV1WebSocketHandler(w http.ResponseWriter, r *http.Request) {
  17. upgradeToWs.CheckOrigin = func(r *http.Request) bool { return true }
  18. ws, err := upgradeToWs.Upgrade(w, r, nil)
  19. if err != nil {
  20. log.Println("cannot upgrade websocket", err)
  21. return
  22. }
  23. // helpful log statement to show connections
  24. log.Println("Websocket Api/V1: Client Connected", r.RemoteAddr)
  25. wsReader(ws)
  26. }
  27. func wsReader(conn *websocket.Conn) {
  28. for {
  29. // read in a message
  30. messageType, p, err := conn.ReadMessage()
  31. if err != nil {
  32. log.Println(err)
  33. return
  34. }
  35. switch messageType {
  36. case websocket.TextMessage:
  37. WsProcessingTxtMessage(conn, string(p))
  38. break
  39. case websocket.BinaryMessage:
  40. WsProcessingBinaryMessage(conn, p)
  41. break
  42. case websocket.PingMessage:
  43. break
  44. case websocket.PongMessage:
  45. break
  46. }
  47. }
  48. }
  49. func WsProcessingTxtMessage(conn *websocket.Conn, str string) {
  50. if str == "send dummy string for 500 times" {
  51. go wsDummySender(conn)
  52. } else {
  53. WsEchoIncomingMessage(conn, str, websocket.TextMessage)
  54. }
  55. }
  56. func WsProcessingBinaryMessage(conn *websocket.Conn, data []byte) {
  57. return
  58. }
  59. func WsEchoIncomingMessage(conn *websocket.Conn, msg string, messageType int) {
  60. // print out that message for clarity
  61. fmt.Println(msg)
  62. // this is echo
  63. if err := conn.WriteMessage(messageType, []byte(msg)); err != nil {
  64. log.Println(err)
  65. return
  66. }
  67. }
  68. func wsDummySender(conn *websocket.Conn) {
  69. //write subsequent 5 copies, each after 1 second
  70. log.Info("start sending server data to client ..")
  71. p := "From server "
  72. for i := 1; i < 500; i++ {
  73. time.Sleep(1 * time.Second)
  74. n := time.Now()
  75. s := n.Format("2006-01-02 15:04:05")
  76. p1 := p + s
  77. //msg := fmt.Sprintf("copy %d, %s, %s", i, p, wsDummyString()) // 4M long string no issue
  78. msg := fmt.Sprintf("copy %d, %s ", i, p1)
  79. log.Info("dummy sender is working, ", msg)
  80. if err := conn.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil {
  81. log.Println("wsDummySender stopped on error: ", err)
  82. return
  83. }
  84. }
  85. }