多くの作業をシミュレート同時ユーザーへの接続用WebSocketを確立するために必要とされ、初めは達成するために、サードパーティ製のJMeterのWebSocketパッケージを使用することですで、あまりにもマルチスレッドのJMeterを発見したシステムリソースを消費し、約8000の周りにビルド負荷が圧力測定プロセスに接続されたマシンであるときリソースではなく、達成するために行く、ほとんど占有されていました。
これは、実装コードの一部です:
メインパッケージ のインポート( 「エンコーディング/ jsonの」 「フラグ」 「FMT 」 「github.com/gorilla/websocket 」 「github.com/satori/go.uuid 」 「ログ」 「ネット/のURL 」 「正規表現」 「同期を」 」時間」 ) 型Connetionの構造体{ CON * websocket.Conn ミューテックスsync.Mutex }
//定义命令行参数 VAR ADDR =フラグ。文字列( 「」、" IP:ポート"、" HTTPサービスのアドレス" ) VAR clientUuid = flag.String(" U "、"" 、" UUID " ) VAR C = flag.Int(" C "、5、" 接続数" ) FUNC webSocketConn(WG sync.WaitGroup、MSG [] バイト){ U: = {url.URLスキーム:" WS "、ホスト:* addrは} だったダイヤラ* websocket.Dialer CONN、_、ERR: = dialer.Dial(u.String()、NIL) IF!ERR = ゼロ{ fmt.Println(ERR) リターン } WERR: = conn.WriteMessage(websocket.TextMessage、MSG) // FMT。 printf( "送信:%S \ N-"、文字列(MSG)) // 2.正規表現オブジェクトを作成 REGXを、_:= regexp.Compile(" \\ {W} 8( - 4 \\ {W。 。}){} 3から12 {W} \\である" ) // 3.正規表現オブジェクトは、指定された文字列と一致 RES:regx.FindString =(文字列(MSG)) // fmt.Printf("一致をclientId:%S \ N-」、RES) MSG1:=メイク(マップ[ 文字列 ] インターフェイス{}) MSG2: =メイク(地図[ ストリング ] インターフェイス{}) MSG2 [ " 成功" = 真 MSG1 [ " のclientId " ] = RES MSG1 [ " にmessageType " ] = " ACK " MSG1 [ " messageIdです" ] = " 5e7d6e31e4b079c2b22876d8 " MSG1 [ " データ" = MSG2 AMSG、_: = json.Marshal(MSG1) 場合 WERR =!ゼロ{ FMT。println(WERR) } // 宣言タイマ10S、ハートビート時間10秒に設定 ティッカー:= time.NewTicker(time.Second * 10 ) 接続: =&Connetion { CON:コネティカット、 } // オープンマルチスレッド 接続を行きます.timeWriter(ティッカー、コネティカット州) のための{ :_、メッセージ、ERR = conn.ReadMessage() IF ERR =!nilの{ fmt.Println(" 読む:" 、ERR) リターン } //ミューテックス connect.mutex.Lock () werr2:
=connect.con.WriteMessage(websocket.TextMessage、AMSG) connect.mutex.Unlock() もし werr2 =!ゼロ{ fmt.Println(werr2) } fmt.Printf(" 受信された:%S \ n " 、メッセージ) } wg.Done() // 每次把计数器-1 } FUNC(CON * Connetion)timeWriter (ティッカー* time.Ticker、C * websocket.Conn){ 用{ < - ticker.C ERR: = c.SetWriteDeadline(time.Now()を追加(10 * time.Second)) // fmt.Println(時間.Now()。フォーマット(time.UnixDate)) の場合、ERR!= nilの{ log.Printf("ピングエラー:%S \ n " 、err.Error()) } con.mutex.Lock() 場合 ERR:= c.WriteMessage(websocket.PingMessage、NIL)。ERR =!ゼロ{ log.Printf(" ピングエラー:%S \ n " 、err.Error()) } con.mutex.Unlock() } } FUNC NewConnMsg()[] バイト{ MSG: =メイク(マップ[ ストリング ] インターフェイス{}) UUID1、_: = uuid.NewV4() // fmt.Printf( "UUID值:%S \ n"は、UUID1) ID:= uuid1.String() であれば * clientUuid =="" { MSG [ " のclientId " ] = ID } 他{ MSG [ " のclientId " ] = * clientUuid } MSG [ " messageIdです" ] = " 5e7d6e31e4b079c2b22876d8 " MSG [ " にmessageType " ] = " LOGIN " MSG [ " たtargetType " ] = " パッセンジャー" BMsg、_: = JSON。 元帥(MSG) // log.Printf( "%S \ N-"、BMSG) リターンBMSG } FUNC RUN(){ flag.Parse() // コマンドライン引数 VAR WG sync.WaitGroup // 宣言カウンタ 用 I:= 0 ; I <C *; I ++ { (wg.Add 。1) // セットカウンタ初期値 ゴーwebSocketConn(WG、NewConnMsg()) IF(%のC * 200)== 0 { time.sleep(time.Millisecond * 50 ) // fmt.Println(Time.now()。フォーマット(time.UnixDate)) } } log.Printf( " creaateのWebSocket接続:V%\ N- "、* C) wg.Wait() // カウンタが0にデクリメントされるまで、コードをブロックラン } FUNCメイン(){ // NewConnMsg() RUN () }
WebSocketの同時書き込みをサポートしていないので、あなたはそれがエラーになりませんが、ミューテックスの代わりにメッセージを書き込むために必要とされる追加する必要があります。WebSocketの接続、外出先への同時書き込みを