package v1 import ( "bytes" "context" "designs/app/common/request" "designs/global" "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/vmihailenco/msgpack/v5" "io" "net/http" "strconv" "time" ) func Websocket2(c *gin.Context) { //url := "192.168.1.139:9000/handle" url := "127.0.0.1:9000/handle" for i := 0; i <= 5000; i++ { time.Sleep(50 * time.Millisecond) go func() { openId := "1test00" + strconv.Itoa(i) time.Sleep(time.Millisecond) dial := "ws://" + url //fmt.Println(dial) c, _, err := websocket.DefaultDialer.Dial(dial, nil) if err != nil { global.App.Log.Error(err.Error()) fmt.Println(err) } //defer c.Close() go func() { for { pong := ExplodeMsg(&MsgStruct{ Type: MSG_TYPE_PING, Data: time.Now().UnixMilli(), }) err = c.WriteMessage(websocket.TextMessage, pong) time.Sleep(time.Second * 10) } }() fmt.Println(openId, "登录成功,开始心跳") // 读取服务器的响应 go ReadMsg(c) }() } } func Websocket(c *gin.Context) { form := request.Check(c, &struct { OpenId string `form:"openId" json:"openId" binding:""` }{}) if form.OpenId == "" { form.OpenId = "1test00" } url := "127.0.0.1:8788" url = "lianliankan.ichunhao.cn" url = "nuoddzhise.ichunhao.cn" for i := 0; i <= 4000; i++ { openId := form.OpenId + strconv.Itoa(i) time.Sleep(time.Millisecond * 60) go TestWebsocket(openId, url) } //var i = 0 //for { // openId := "1test00" + strconv.Itoa(i) // i++ // time.Sleep(time.Millisecond) // go TestWebsocket(openId, url) // i++ // go TestWebsocket(openId, url) //} } func Websocket1(c *gin.Context) { url := "dev1.ichunhao.cn" for i := 0; i <= 5000; i++ { openId := "1test00" + strconv.Itoa(i) time.Sleep(time.Millisecond * 10) go TestWebsocket(openId, url) } //var i = 0 //for { // openId := "7test00" + strconv.Itoa(i) // i++ // time.Sleep(time.Millisecond) // go TestWebsocket(openId) // i++ // go TestWebsocket(openId) //} } func TestWebsocket(openId string, url string) { var token string //http://101.42.6.84:8787 //http://127.0.0.1:8788 dev.ichunhao.cn gid := "tt_fpdz3" token = global.App.Redis.Get(context.Background(), openId+"userId").Val() if token == "" { //请求登录接口,获取token reportDat := map[string]string{ "code": openId, "gid": gid, "pf": "web", } //请求接口获取token // /v1/user/getSysTime /v1/user/login content, err := CurlPost("http://"+url+"/v1/user/login", reportDat, nil) if err != nil { global.App.Log.Error(err.Error()) fmt.Println(err) } var resp struct { Data struct { Token string `json:"token"` } `json:"data"` } str2oErr := json.Unmarshal([]byte(content), &resp) if str2oErr != nil { global.App.Log.Error(str2oErr.Error()) fmt.Println(err) } if resp.Data.Token == "" { fmt.Println(content) } global.App.Redis.Set(context.Background(), openId+"userId", resp.Data.Token, time.Hour*3) token = resp.Data.Token //fmt.Println(content) } //fmt.Println(openId, "登录成功,开始心跳") //return //创建一个WebSocket客户端连接到服务器 // 192.168.1.139:8788 if token == "" { fmt.Println("token is empty") return } dial := "ws://" + url + "/v1/handle?token=" + token //fmt.Println(dial) c, _, err := websocket.DefaultDialer.Dial(dial, nil) if err != nil { global.App.Log.Error(err.Error()) fmt.Println(err) } //defer c.Close() go func() { ////set_team //msg := ExplodeMsg(&MsgStruct{ // Type: MSG_TYPE_SET_TEAM, // Data: 4, //}) //err = c.WriteMessage(websocket.BinaryMessage, msg) // ////match //msg = ExplodeMsg(&MsgStruct{ // Type: MSG_TYPE_MATCH, // Data: 2, //}) //err = c.WriteMessage(websocket.TextMessage, msg) // //time.Sleep(time.Second * 10) ////MSG_TYPE_MATCH // //for i := 1; i <= 100; i++ { // msg = ExplodeMsg(&MsgStruct{ // Type: MSG_TYPE_UPDATE_USER_GAMEDATA, // Data: map[string]interface{}{ // "data": map[string]string{ // "aa": "bbb", // "cc": "dddd", // }, // "userKey": gid + "||web||" + openId, // }, // }) // // // //msg = ExplodeMsg(&MsgStruct{ // // Type: MSG_TYPE_TALK, // // Data: "你好你好你好", // //}) // // err = c.WriteMessage(websocket.BinaryMessage, msg) // time.Sleep(time.Second) //} // ////离开 //msg = ExplodeMsg(&MsgStruct{ // Type: MSG_TYPE_ROOM_EXIT, // Data: "", //}) //err = c.WriteMessage(websocket.TextMessage, msg) for { pong := ExplodeMsg(&MsgStruct{ Type: MSG_TYPE_PING, Data: time.Now().UnixMilli(), }) err = c.WriteMessage(websocket.TextMessage, pong) time.Sleep(time.Second) } }() fmt.Println(openId, "登录成功,开始心跳") // 读取服务器的响应 go ReadMsg(c) } type MsgStruct struct { Type string `msgpack:"type" json:"type"` Data interface{} `msgpack:"data" json:"data"` } func ExplodeMsg(msg *MsgStruct) []byte { //data, _ := json.Marshal(msg) data, _ := msgpack.Marshal(msg) return data } func ReadMsg(c *websocket.Conn) { for { _, _, err := c.ReadMessage() if err != nil { global.App.Log.Error(err.Error()) fmt.Println(err) } //fmt.Printf("%s\n", message) } } func CurlPost(requestUrl string, requestBody interface{}, headerMap map[string]string) (string, error) { //转换json jsonBytes, err := json.Marshal(requestBody) if err != nil { return "", err } //创建请求 req, err := http.NewRequest("POST", requestUrl, bytes.NewReader(jsonBytes)) if err != nil { return "", err } //设置请求头 req.Header.Set("Content-Type", "application/json;charset=UTF-8") for k, v := range headerMap { //req.Header.Set("Accept-Encoding", "gzip, deflate, br") req.Header.Set(k, v) } //发送请求 clt := http.Client{Timeout: 60 * time.Second} res, err := clt.Do(req) if err != nil { return "", err } //获取结果 body, err := io.ReadAll(res.Body) data := string(body) return data, err } const ( MSG_TYPE_PING = "ping" //心跳 MSG_TYPE_PONG = "pong" //心跳回传 MSG_TYPE_TALK = "c2s_talk" //消息 -- 发送给所有人 MSG_TYPE_TALK_RES = "s2c_talk" //消息 -- 服务端回发消息 MSG_TYPE_MSG = "c2s_message" //消息 -- 发送给所有人 MSG_TYPE_MSG_TO_HOST = "c2s_message_to_host" //消息 -- 发送给主机 MSG_TYPE_MSG_WITHOUT_SELF = "c2s_message_without_self" //消息 -- 发送给除自己以外的人 MSG_TYPE_EXIT = "exit" //退出 MSG_TYPE_MATCH = "c2s_match" //开始匹配 MSG_TYPE_SET_TEAM = "c2s_set_team" //创建组队 MSG_TYPE_JOIN_TEAM = "c2s_join_team" //加入组队 MSG_TYPE_EXIT_TEAM = "c2s_exit_team" //离开组队 MSG_TYPE_LOGIN_SUCCESS = "s2c_login_success" //登录成功后,服务器回传给前端 MSG_TYPE_MATCH_SUCCESS = "s2c_match_success" //匹配到对手后,提示匹配成功,加入房间 MSG_TYPE_TEAM_SUCCESS = "s2c_team_success" //进入房间后,提示 MSG_TYPE_MATCH_CANCEL = "c2s_match_cancel" //取消匹配 MSG_TYPE_ROOM_EXIT = "c2s_room_exit" //用户离开房间 MSG_TYPE_UPDATE_ROOM_GAMEDATA = "c2s_update_room_gameData" //更新房间的游戏信息 MSG_TYPE_UPDATE_USER_GAMEDATA = "c2s_update_user_gameData" //更新用户的游戏信息 MSG_TYPE_ROOM_GAMEDATA_CHANGE = "s2c_room_gameData_change" //房间游戏信息修改,广播给所有玩家 MSG_TYPE_USER_GAMEDATA_CHANGE = "s2c_user_gameData_change" //房间游戏信息修改,广播给所有玩家 MSG_TYPE_TEAM_USER_JOIN = "s2c_team_user_join" //队伍用户加入房间,通知其他人 MSG_TYPE_TEAM_USER_EXIT = "s2c_team_user_exit" //队伍用户离开房间,通知其他人 MSG_TYPE_USER_DISCONNECT = "s2c_user_disconnect" //队伍用户掉线,通知其他人 MSG_TYPE_USER_RECONNECT = "s2c_user_reconnect" //队伍用户重连,通知其他人 MSG_TYPE_TEAM_CHANGE_HOST = "s2c_team_change_host" //队伍更换房主 MSG_TYPE_ROOM_CHANGE_HOST = "s2c_room_change_host" //房间更换房主 MSG_TYPE_ERROR = "s2c_error" //有错误的时候专用 MSG_TYPE_TEAM_JOIN_FAIL = "s2c_join_team_fail" //加入队伍失败时 MSG_TYPE_TEAM_LEFT_FAIL = "s2c_left_team_fail" //离开队伍失败时 MSG_TYPE_CLOSE_ROOM_FAIL = "s2c_close_room_fail" //关闭房间失败 MSG_TYPE_USER_MATCH = "s2c_match" //用户进入匹配队列 MSG_TYPE_USER_MATCH_CANCEL = "s2c_match_cancel" //用户离开匹配队列 MSG_TYPE_KICK_OUT = "c2s_kick_out" //房主踢人出房间 MSG_TYPE_READY = "c2s_ready" //准备开始 MSG_TYPE_READY_RES = "s2c_ready" //准备开始回发 MSG_TYPE_NOT_READY = "s2c_not_ready" //有人没准备 MSG_TYPE_READY_CANCEL = "c2s_ready_cancel" //取消准备 MSG_TYPE_READY_CANCEL_RES = "c2s_ready_cancel" //取消准备回发 MSG_TYPE_CLOSE_ROOM = "c2s_close_room" //发送消息准备关闭房间 MSG_TYPE_ROOM_CLOSED = "s2c_room_closed" //房间已关闭 MSG_TYPE_EXIT_ROOM = "s2c_exit_room" //用户离开房间 MSG_TYPE_TO_BACKED = "c2s_to_backed" //切换到后台 MSG_TYPE_BACKED_RETURN = "c2s_backed_return" //从后台回来 MSG_TYPE_SETTLEMENT = "s2c_settlement" //游戏结算消息 MSG_TYPE_FINISH = "c2s_finish" //玩家完成游戏 MSG_TYPE_FINISH_RES = "s2c_finish" //玩家完成游戏回发 MSG_TYPE_RANK_DATA = "c2s_rank_data" //查询排行榜 MSG_TYPE_RANK_DATA_RES = "s2c_rank_data" //查询排行榜回发 MSG_TYPE_RECEIVE_REWARD = "c2s_receive_reward" //领取奖励 MSG_TYPE_RECEIVE_REWARD_RES = "s2c_receive_reward" MSG_TYPE_SEASON = "c2s_season" MSG_TYPE_SEASON_RES = "s2c_season" )