• haoyanbin's avatar
    1 · 4b2f94d8
    haoyanbin authored
    4b2f94d8
client.go 2.27 KB
package main

import (
	"flag"
	"github.com/gorilla/websocket"
	"log"
	"net/http"
	"net/url"
	"os"
	"os/signal"
	"pool/pool"
	"time"
)

var addr = flag.String("addr", "39.96.85.45:11001", "http service address")

func main() {
	go WsClient("1_system_3_1")
	select {}
}

func WsClient(id string) {
	flag.Parse()
	log.SetFlags(0)

	interrupt := make(chan os.Signal, 1)
	signal.Notify(interrupt, os.Interrupt)

	u := url.URL{Scheme: "ws", Host: *addr, Path: "/ws"}
	log.Printf("connecting to %s", u.String())
	head := http.Header{}
	log.Printf("connecting info: %s", id)
	head.Add("Sec-Websocket-Protocol", id)
	c, _, err := websocket.DefaultDialer.Dial(u.String(), head)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer c.Close()
	ping := make(chan int)
	c.SetPingHandler(func(appData string) error {
		ping <- 1
		return nil
	})

	done := make(chan struct{})

	go func() {
		ticker1 := time.NewTicker(10 * time.Second)
		defer func() {
			ticker1.Stop()
			close(done)
		}()
		for {
			_, message, err := c.ReadMessage()
			if err != nil {
				log.Printf("read:%s", err.Error())
				return
			}
			log.Printf("recv: %s", message)
			select {
			case <-ticker1.C:
				return
			}
		}
	}()

	ticker := time.NewTicker(time.Second)

	defer ticker.Stop()

	for {
		select {
		case <-done:
			//重新连接
			go WsClient(id)
			return
		case <-ticker.C:
			msg := &pool.SendMsg{
				ToClientId:   "12",
				FromClientId: "13",
				Msg:          "test" + time.Now().String(),
				Channel:      []string{"1", "2"},
			}
			//m,_:=proto.Marshal(msg)
			m := pool.SerializeJson(msg)
			err := c.WriteMessage(websocket.BinaryMessage, m)
			if err != nil {
				log.Printf("write:%s", err.Error())
				return
			}
		case <-interrupt:
			log.Printf("interrupt")

			// Cleanly close the connection by sending a close message and then
			// waiting (with timeout) for the server to close the connection.
			err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
			if err != nil {
				log.Printf("write close:%s", err.Error())
				return
			}
			select {
			case <-done:
			case <-time.After(time.Second):
			}
			return
		case <-ping:
			err := c.WriteMessage(websocket.PongMessage, nil)
			if err != nil {
				log.Printf("write pong:%s", err.Error())
				return
			}
		}
	}
}