main.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/url"
  7. "os"
  8. "os/signal"
  9. "time"
  10. "github.com/gorilla/websocket"
  11. )
  12. func main() {
  13. addr := flag.String("addr", "localhost:9080", "http service address")
  14. flag.Parse()
  15. fmt.Println("vim-go")
  16. u := url.URL{Scheme: "ws", Host: *addr, Path: "/ws"}
  17. log.Printf("connecting to %s", u.String())
  18. interrupt := make(chan os.Signal, 1)
  19. signal.Notify(interrupt, os.Interrupt)
  20. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  21. if err != nil {
  22. log.Fatal("dial:", err)
  23. }
  24. defer c.Close()
  25. done := make(chan struct{})
  26. go func() {
  27. defer close(done)
  28. for {
  29. _, message, err := c.ReadMessage()
  30. if err != nil {
  31. log.Println("close:", err)
  32. return
  33. }
  34. fmt.Println(string(message))
  35. }
  36. }()
  37. for {
  38. select {
  39. case <-done:
  40. return
  41. case <-interrupt:
  42. log.Println("interrupt")
  43. // Cleanly close the connection by sending a close message and then waiting (with timeout) for the
  44. // server to close the connection.
  45. err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
  46. if err != nil {
  47. log.Println("write close:", err)
  48. return
  49. }
  50. select {
  51. case <-done:
  52. log.Println("Successfully close")
  53. case <-time.After(1 * time.Second):
  54. log.Println("Forced close")
  55. }
  56. return
  57. }
  58. }
  59. }