Created
June 8, 2016 23:44
-
-
Save pims/2f6f87061ff8f485b3067ebbfa0eaecb to your computer and use it in GitHub Desktop.
Websocket client from https://github.com/gorilla/websocket/blob/master/examples/echo/client.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright 2015 The Gorilla WebSocket Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
// +build ignore | |
package main | |
import ( | |
"flag" | |
"log" | |
"net/url" | |
"os" | |
"os/signal" | |
"time" | |
"github.com/gorilla/websocket" | |
) | |
var addr = flag.String("addr", "localhost:8080", "http service address") | |
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()) | |
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) | |
if err != nil { | |
log.Fatal("dial:", err) | |
} | |
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) | |
return | |
} | |
log.Printf("recv: %s", message) | |
} | |
}() | |
ticker := time.NewTicker(time.Second) | |
defer ticker.Stop() | |
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 | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment