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