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ů.

66 lines
1.5KB

  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. // We'll need to define an upgradeToWs
  10. // this will require a Read and Write buffer size
  11. var upgradeToWs = websocket.Upgrader{
  12. ReadBufferSize: 1024,
  13. WriteBufferSize: 1024,
  14. }
  15. func apiV1WebSocketHandler(w http.ResponseWriter, r *http.Request) {
  16. upgradeToWs.CheckOrigin = func(r *http.Request) bool { return true }
  17. ws, err := upgradeToWs.Upgrade(w, r, nil)
  18. if err != nil {
  19. log.Println(err)
  20. }
  21. // helpful log statement to show connections
  22. log.Println("Websocket Api/V1: Client Connected")
  23. wsReader(ws)
  24. }
  25. func wsReader(conn *websocket.Conn) {
  26. for {
  27. // read in a message
  28. messageType, p, err := conn.ReadMessage()
  29. if err != nil {
  30. log.Println(err)
  31. return
  32. }
  33. // print out that message for clarity
  34. fmt.Println(string(p))
  35. if err := conn.WriteMessage(messageType, p); err != nil {
  36. log.Println(err)
  37. return
  38. }
  39. if string(p) == "send dummy string for 500 times" {
  40. go wsDummySender(conn)
  41. }
  42. }
  43. }
  44. func wsDummySender(conn *websocket.Conn) {
  45. //write subsequent 5 copies, each after 1 second
  46. log.Info("start sending server data to client ..")
  47. p := "dummy string from server "
  48. for i := 1; i < 500; i++ {
  49. time.Sleep(1 * time.Second)
  50. msg := fmt.Sprintf("copy %d, %s", i, p)
  51. log.Info("dummy sender is working, ", msg)
  52. if err := conn.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil {
  53. log.Println("wsDummySender stopped on error: ", err)
  54. return
  55. }
  56. }
  57. }