package main import ( "flag" "fmt" "github.com/gorilla/websocket" "log" "net/http" "net/url" "os" "os/signal" "pool/pool" "runtime" "time" ) var addr2 = flag.String("addr", "127.0.0.1:11001", "http service address") func main() { runtime.GOMAXPROCS(runtime.NumCPU()) for i := 1; i < 50; i++ { go wsClient2(fmt.Sprintf("lA6fUNMamyUBlOokPOeiGg==_1_%d", i)) } select {} } func wsClient2(id string) { flag.Parse() log.SetFlags(0) //list := strings.Split(id, "_") //Id := "lA6fUNMamyUBlOokPOeiGg==_1_" + list[2] //chann := list[1:] interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) u := url.URL{Scheme: "ws", Host: *addr2, 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 func() { c.Close() //重新连接 //t := grand.N(10, 20) //time.Sleep(time.Duration(t) * time.Second) //go WsClient(id) }() ping := make(chan int) c.SetPingHandler(func(appData string) error { ping <- 1 return nil }) done := make(chan struct{}) msg1 := &pool.SendMsg{ ToClientId: "", FromClientId: id, ProcedureType: 1, SendTime: time.Now().Format("2006-01-02 15:04:05"), Msg: "test" + time.Now().Format("2006-01-02 15:04:05"), } m1 := pool.SerializeJson(msg1) fmt.Println(1) err = c.WriteMessage(websocket.BinaryMessage, m1) if err != nil { fmt.Println("write:", err.Error()) return } time.Sleep(5*time.Second) msg2 := &pool.SendMsg{ ToClientId: "", FromClientId: id, ProcedureType: 2, SendTime: time.Now().Format("2006-01-02 15:04:05"), Msg: "{\"petName\":\"gogogo\",\"petAge\":\"1.1\",\"question\":\"eye\"}", } m2 := pool.SerializeJson(msg2) fmt.Println(2) err = c.WriteMessage(websocket.BinaryMessage, m2) if err != nil { fmt.Println("write:", err.Error()) return } time.Sleep(5*time.Second) msg3 := &pool.SendMsg{ ToClientId: id, FromClientId: "6_2_14", ProcedureType: 3, SendTime: time.Now().Format("2006-01-02 15:04:05"), } m3 := pool.SerializeJson(msg3) fmt.Println(3) err = c.WriteMessage(websocket.BinaryMessage, m3) if err != nil { fmt.Println("write:", err.Error()) return } ticker := time.NewTicker(10 * time.Second) ticker1 := time.NewTicker(20 * time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: msg := &pool.SendMsg{ ToClientId: "6_2_14", FromClientId: id, ProcedureType: 6, SendTime: time.Now().Format("2006-01-02 15:04:05"), Msg: "test" + time.Now().Format("2006-01-02 15:04:05"), } m := pool.SerializeJson(msg) fmt.Println(6) err := c.WriteMessage(websocket.BinaryMessage, m) if err != nil { fmt.Println("write:", err.Error()) return } case <-interrupt: fmt.Println("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 { fmt.Println("write close:", err.Error()) return } select { case <-done: case <-time.After(time.Second): } return case <-ping: err := c.WriteMessage(websocket.PongMessage, nil) if err != nil { fmt.Println("write pong:", err.Error()) return } case <-ticker1.C: err := c.WriteMessage(websocket.PingMessage, nil) if err != nil { fmt.Println("write pong:", err.Error()) return } //return } } }