Start.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package client
  2. import (
  3. "log"
  4. "net/url"
  5. "os"
  6. "os/signal"
  7. "strconv"
  8. "time"
  9. "github.com/gorilla/websocket"
  10. )
  11. func (client *Client) Start() {
  12. interrupt := make(chan os.Signal, 1)
  13. signal.Notify(interrupt, os.Interrupt)
  14. u := url.URL{Scheme: "ws", Host: client.ServerAddress + ":" + strconv.Itoa(client.ServerPort), Path: "/ws"}
  15. log.Printf("connecting to %s", u.String())
  16. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  17. if err != nil {
  18. log.Fatal("dial:", err)
  19. }
  20. defer c.Close()
  21. done := make(chan struct{})
  22. go func() {
  23. defer close(done)
  24. for {
  25. _, message, err := c.ReadMessage()
  26. if err != nil {
  27. log.Println("read:", err)
  28. return
  29. }
  30. log.Printf("recv: %s", message)
  31. }
  32. }()
  33. ticker := time.NewTicker(time.Second)
  34. defer ticker.Stop()
  35. for {
  36. select {
  37. case <-done:
  38. return
  39. case t := <-ticker.C:
  40. err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
  41. if err != nil {
  42. log.Println("write:", err)
  43. return
  44. }
  45. case <-interrupt:
  46. log.Println("interrupt")
  47. // Cleanly close the connection by sending a close message and then
  48. // waiting (with timeout) for the server to close the connection.
  49. err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
  50. if err != nil {
  51. log.Println("write close:", err)
  52. return
  53. }
  54. select {
  55. case <-done:
  56. case <-time.After(time.Second):
  57. }
  58. return
  59. }
  60. }
  61. }