126 lines
2.4 KiB
Go
126 lines
2.4 KiB
Go
// Package golink 连接
|
|
package golink
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/stress/helper"
|
|
"go_dreamfactory/stress/model"
|
|
"go_dreamfactory/stress/robot"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
)
|
|
|
|
const (
|
|
firstTime = 1 * time.Second // 连接以后首次请求数据的时间
|
|
intervalTime = 1 * time.Second // 发送数据的时间间隔
|
|
)
|
|
|
|
var (
|
|
// 请求完成以后是否保持连接
|
|
keepAlive bool
|
|
)
|
|
|
|
func init() {
|
|
keepAlive = true
|
|
}
|
|
|
|
// WebSocket webSocket go link
|
|
func WebSocket(ctx context.Context, chanID uint64, ch chan<- *model.RequestResults, totalNumber uint64,
|
|
wg *sync.WaitGroup, request *model.Request, r *robot.Robot) {
|
|
defer func() {
|
|
wg.Done()
|
|
}()
|
|
defer func() {
|
|
r.CloseHandler()
|
|
}()
|
|
|
|
var (
|
|
i uint64
|
|
)
|
|
// 暂停60秒
|
|
t := time.NewTimer(firstTime)
|
|
for {
|
|
select {
|
|
case <-t.C:
|
|
t.Reset(intervalTime)
|
|
// 请求
|
|
webSocketRequest(chanID, ch, i, request, r)
|
|
// 结束条件
|
|
i = i + 1
|
|
if i >= totalNumber {
|
|
goto end
|
|
}
|
|
}
|
|
}
|
|
end:
|
|
t.Stop()
|
|
|
|
if keepAlive {
|
|
// 保持连接
|
|
chWaitFor := make(chan int, 0)
|
|
<-chWaitFor
|
|
//time.Sleep(15 * time.Millisecond)
|
|
//return
|
|
}
|
|
return
|
|
}
|
|
|
|
// webSocketRequest 请求
|
|
func webSocketRequest(chanID uint64, ch chan<- *model.RequestResults, i uint64, request *model.Request,
|
|
r *robot.Robot) {
|
|
var (
|
|
isSucceed = false
|
|
errCode = model.HTTPOk
|
|
byteLen int64 // 协议传输字节数
|
|
)
|
|
|
|
startTime := time.Now()
|
|
//r.Create()
|
|
//isSucceed = r.AddGrormetItem()
|
|
|
|
//startTime := time.Now()
|
|
// r.GetRandUser() // 获取随机在线玩家数据
|
|
|
|
r.GetGourmetList()
|
|
|
|
for {
|
|
var msg *pb.UserMessage = &pb.UserMessage{}
|
|
data, err := r.GetMessagedata()
|
|
if err != nil {
|
|
fmt.Printf("readMessage err:%v", err)
|
|
isSucceed = false
|
|
break
|
|
}
|
|
if err = proto.Unmarshal(data, msg); err != nil {
|
|
fmt.Printf("unmarshal err:%v", err)
|
|
}
|
|
if msg.MainType == "gourmet" && msg.SubType == "getlist" {
|
|
byteLen += int64(len(data))
|
|
isSucceed = true
|
|
resp := &pb.GourmetGetListResp{}
|
|
if !comm.ProtoUnmarshal(msg, resp) { //反序列化失败
|
|
break
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
requestTime := uint64(helper.DiffNano(startTime))
|
|
requestResults := &model.RequestResults{
|
|
ID: "",
|
|
ChanID: chanID,
|
|
Time: requestTime,
|
|
IsSucceed: isSucceed,
|
|
ErrCode: errCode,
|
|
ReceivedBytes: byteLen,
|
|
}
|
|
requestResults.SetID(chanID, i)
|
|
ch <- requestResults
|
|
}
|