基于:github.com/gorilla/websocket 实现
func main() {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
ws := "ws://127.0.0.1:8080/ws"
c, _, err := websocket.DefaultDialer.Dial(ws, nil)
if err != nil {
log.Fatalln("dial", err)
}
defer c.Close()
fmt.Println("connect ...")
acceptMsg := func() {
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("recv: \n %s \n", message)
}
}
heartbeat := func() {
for {
if _err := c.WriteMessage(websocket.PingMessage, nil); _err != nil {
log.Fatal("ws 心跳失败")
return
}
time.Sleep(5 * time.Second)
}
}
sendMsg := func() {
for {
if _err := c.WriteMessage(websocket.TextMessage, []byte("test message")); _err != nil {
log.Fatal("ws 发送失败")
return
}
time.Sleep(1 * time.Second)
}
}
go acceptMsg()
go heartbeat()
go sendMsg()
select {
case <-interrupt:
log.Println("interrupt")
if err_ := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")); err_ != nil {
log.Println("write close:", err)
return
}
}
}