123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- 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"
- )
|