summaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go')
-rw-r--r--Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go38
1 files changed, 32 insertions, 6 deletions
diff --git a/Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go b/Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go
index 45a023175..6578094e7 100644
--- a/Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go
+++ b/Godeps/_workspace/src/github.com/gorilla/websocket/examples/echo/client.go
@@ -10,6 +10,8 @@ import (
"flag"
"log"
"net/url"
+ "os"
+ "os/signal"
"time"
"github.com/gorilla/websocket"
@@ -21,6 +23,9 @@ func main() {
flag.Parse()
log.SetFlags(0)
+ interrupt := make(chan os.Signal, 1)
+ signal.Notify(interrupt, os.Interrupt)
+
u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo"}
log.Printf("connecting to %s", u.String())
@@ -30,13 +35,16 @@ func main() {
}
defer c.Close()
+ done := make(chan struct{})
+
go func() {
defer c.Close()
+ defer close(done)
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
- break
+ return
}
log.Printf("recv: %s", message)
}
@@ -45,11 +53,29 @@ func main() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
- for t := range ticker.C {
- err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
- if err != nil {
- log.Println("write:", err)
- break
+ for {
+ select {
+ case t := <-ticker.C:
+ err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
+ if err != nil {
+ log.Println("write:", err)
+ return
+ }
+ case <-interrupt:
+ log.Println("interrupt")
+ // To cleanly close a connection, a client should send a close
+ // frame and wait for the server to close the connection.
+ err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
+ if err != nil {
+ log.Println("write close:", err)
+ return
+ }
+ select {
+ case <-done:
+ case <-time.After(time.Second):
+ }
+ c.Close()
+ return
}
}
}