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 := 0; i < 1500; 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{}) //t := grand.N(30, 90) //go func() { // ticker1 := time.NewTicker(time.Duration(t) * 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(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, Msg: "test" + time.Now().Format("2006-01-02 15:04:05"), //Channel: chann, } m := pool.SerializeJson(msg) fmt.Println(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 } case <-ticker1.C: err := c.WriteMessage(websocket.PingMessage, nil) if err != nil { log.Printf("write pong:%s", err.Error()) return } //return } } }