feat 排队

This commit is contained in:
2026-01-06 18:36:19 +08:00
parent fdb4798b36
commit 2e1a418485
10 changed files with 214 additions and 34 deletions

View File

@@ -1,31 +1,38 @@
package ws
import (
"bytes"
"common/log"
"common/proto/sc/sc_pb"
"common/utils"
"context"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
"github.com/gorilla/websocket"
"google.golang.org/protobuf/proto"
"io"
"net/http"
)
type Client struct {
addr string
token string
httpAddr string
websocketAddr string
conn *websocket.Conn
ctx context.Context
cancel context.CancelFunc
writeChaen chan []byte
conn *websocket.Conn
ctx context.Context
cancel context.CancelFunc
writeChan chan []byte
USN int64
}
func NewClient(addr string, token string) *Client {
func NewClient(httpAddr, websocketAddr string) *Client {
c := &Client{
addr: addr,
token: token,
writeChaen: make(chan []byte, 1024),
httpAddr: httpAddr,
websocketAddr: websocketAddr,
writeChan: make(chan []byte, 1024),
}
c.ctx, c.cancel = context.WithCancel(context.Background())
return c
@@ -33,17 +40,43 @@ func NewClient(addr string, token string) *Client {
func (c *Client) Start() {
go func() {
data := fmt.Sprintf(`{"phone": "%v", "code": "1234"}`, utils.SnowflakeInstance().Generate().String())
resp, err := http.Post(c.httpAddr+"/gw/login", "application/json", bytes.NewBufferString(data))
if err != nil {
log.Errorf("POST request failed: %v\n", err)
return
}
defer resp.Body.Close()
all, err := io.ReadAll(resp.Body)
if err != nil {
log.Errorf("Read response body failed: %v\n", err)
return
}
type RespJsonData struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
USN int64 `json:"usn"`
Name string `json:"name"`
AccessToken string `json:"accessToken"`
RefreshToken string `json:"refreshToken"`
} `json:"data,omitempty"`
}
r := &RespJsonData{}
if err = json.Unmarshal(all, r); err != nil {
log.Errorf("json.Unmarshal error: %v, %v", err, string(all))
return
}
c.USN = r.Data.USN
dialer := websocket.DefaultDialer
dialer.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
conn, _, err := dialer.Dial(fmt.Sprintf("%v?token=%v", c.addr, c.token), nil)
conn, _, err := dialer.Dial(fmt.Sprintf("%v?token=%v", c.websocketAddr, r.Data.AccessToken), nil)
if err != nil {
log.Errorf("connect error %v", err.Error())
return
}
c.conn = conn
_ = c.WriteMessage(sc_pb.MessageID_MESSAGE_ID_ENTER_INSTANCE, &sc_pb.C2S_EnterInstance{
InstanceID: 1,
})
go c.startReader()
go c.startWriter()
select {
@@ -73,6 +106,8 @@ func (c *Client) startReader() {
}
if r, ok := router[msg.ID]; ok {
r.Handle(msg.Payload, c)
} else {
log.Errorf("no router for %v", msg.ID)
}
}
}
@@ -81,7 +116,7 @@ func (c *Client) startReader() {
func (c *Client) startWriter() {
for {
select {
case data, ok := <-c.writeChaen:
case data, ok := <-c.writeChan:
if ok {
if err := c.conn.WriteMessage(websocket.BinaryMessage, data); err != nil {
log.Errorf("Send Buff Data error:, %s Conn Writer exit", err)
@@ -108,7 +143,7 @@ func (c *Client) WriteMessage(msgID sc_pb.MessageID, data proto.Message) error {
}
marshal, _ := proto.Marshal(p)
select {
case c.writeChaen <- marshal:
case c.writeChan <- marshal:
default:
return errors.New("send buff chan is full")
}

View File

@@ -10,6 +10,34 @@ import (
"time"
)
type LoginSuccess struct {
}
func (_ *LoginSuccess) Handle(data []byte, client *Client) {
msg := &sc_pb.S2C_LoginSuccess{}
if err := proto.Unmarshal(data, msg); err != nil {
log.Errorf("handle msg error")
client.Stop()
return
}
_ = client.WriteMessage(sc_pb.MessageID_MESSAGE_ID_ENTER_INSTANCE, &sc_pb.C2S_EnterInstance{
InstanceID: msg.InstanceID,
})
}
type QueueUp struct {
}
func (_ *QueueUp) Handle(data []byte, client *Client) {
msg := &sc_pb.S2C_QueueUp{}
if err := proto.Unmarshal(data, msg); err != nil {
log.Errorf("handle msg error")
client.Stop()
return
}
}
type EnterInstance struct {
}

View File

@@ -1,19 +1,19 @@
package ws
import (
"common/utils"
"robot/config"
"strconv"
"time"
)
type Manager struct {
addr string
httpAddr string
websocketAddr string
}
func NewManager(addr string) *Manager {
func NewManager(httpAddr, websocketAddr string) *Manager {
c := &Manager{
addr: addr,
httpAddr: httpAddr,
websocketAddr: websocketAddr,
}
return c
}
@@ -21,8 +21,7 @@ func NewManager(addr string) *Manager {
func (c *Manager) Start() {
cfg := config.Get().Client
for i := int32(0); i < cfg.Count; i++ {
client := NewClient(c.addr, strconv.Itoa(utils.RandInt(int(cfg.USN[0]), int(cfg.USN[1]))))
client.Start()
NewClient(c.httpAddr, c.websocketAddr).Start()
time.Sleep(time.Millisecond * 10)
}
}

View File

@@ -10,6 +10,8 @@ type BaseRouter interface {
func init() {
router = make(map[sc_pb.MessageID]BaseRouter)
router[sc_pb.MessageID_MESSAGE_ID_LOGIN_SUCCESS] = &LoginSuccess{}
router[sc_pb.MessageID_MESSAGE_ID_QUEUE_UP] = &QueueUp{}
router[sc_pb.MessageID_MESSAGE_ID_ENTER_INSTANCE] = &EnterInstance{}
router[sc_pb.MessageID_MESSAGE_ID_POSITION] = &Position{}
}