...
1
2
3
4
5
6
7
8 package main
9
10 import (
11 "flag"
12 "log"
13 "net/url"
14 "os"
15 "os/signal"
16 "time"
17
18 "github.com/gorilla/websocket"
19 )
20
21 var addr = flag.String("addr", "localhost:8080", "http service address")
22
23 func main() {
24 flag.Parse()
25 log.SetFlags(0)
26
27 interrupt := make(chan os.Signal, 1)
28 signal.Notify(interrupt, os.Interrupt)
29
30 u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo"}
31 log.Printf("connecting to %s", u.String())
32
33 c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
34 if err != nil {
35 log.Fatal("dial:", err)
36 }
37 defer c.Close()
38
39 done := make(chan struct{})
40
41 go func() {
42 defer close(done)
43 for {
44 _, message, err := c.ReadMessage()
45 if err != nil {
46 log.Println("read:", err)
47 return
48 }
49 log.Printf("recv: %s", message)
50 }
51 }()
52
53 ticker := time.NewTicker(time.Second)
54 defer ticker.Stop()
55
56 for {
57 select {
58 case <-done:
59 return
60 case t := <-ticker.C:
61 err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
62 if err != nil {
63 log.Println("write:", err)
64 return
65 }
66 case <-interrupt:
67 log.Println("interrupt")
68
69
70
71 err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
72 if err != nil {
73 log.Println("write close:", err)
74 return
75 }
76 select {
77 case <-done:
78 case <-time.After(time.Second):
79 }
80 return
81 }
82 }
83 }
84
View as plain text