github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/gorilla/websocket/examples/echo/client.go (about) 1 // Copyright 2015 The Gorilla WebSocket Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build ignore 6 7 package main 8 9 import ( 10 "flag" 11 "log" 12 "net/url" 13 "os" 14 "os/signal" 15 "time" 16 17 "github.com/insionng/yougam/libraries/gorilla/websocket" 18 ) 19 20 var addr = flag.String("addr", "localhost:8080", "http service address") 21 22 func main() { 23 flag.Parse() 24 log.SetFlags(0) 25 26 interrupt := make(chan os.Signal, 1) 27 signal.Notify(interrupt, os.Interrupt) 28 29 u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo"} 30 log.Printf("connecting to %s", u.String()) 31 32 c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) 33 if err != nil { 34 log.Fatal("dial:", err) 35 } 36 defer c.Close() 37 38 done := make(chan struct{}) 39 40 go func() { 41 defer c.Close() 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 t := <-ticker.C: 59 err := c.WriteMessage(websocket.TextMessage, []byte(t.String())) 60 if err != nil { 61 log.Println("write:", err) 62 return 63 } 64 case <-interrupt: 65 log.Println("interrupt") 66 // To cleanly close a connection, a client should send a close 67 // frame and wait for the server to close the connection. 68 err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) 69 if err != nil { 70 log.Println("write close:", err) 71 return 72 } 73 select { 74 case <-done: 75 case <-time.After(time.Second): 76 } 77 c.Close() 78 return 79 } 80 } 81 }