From 4d1b5e866ce74fdb625adb929b7f45e7baff9d4a Mon Sep 17 00:00:00 2001 From: tangmingyou <234767776@qq.com> Date: Thu, 2 Feb 2023 23:48:27 +0800 Subject: [PATCH] websocket write deadline --- internal/server/ws.go | 19 ++++++++++++++++--- internal/service/auth.go | 5 ++++- internal/service/table.go | 2 +- internal/session/net_client.go | 7 +++++++ tool/security/aes.go | 10 +++++----- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/internal/server/ws.go b/internal/server/ws.go index 9531494..1a09284 100644 --- a/internal/server/ws.go +++ b/internal/server/ws.go @@ -56,14 +56,27 @@ func handleNetClient(client *session.NetClient) { //var account *session.NetAccount //var player *session.Player + // https://github.com/gorilla/websocket/blob/a68708917c6a4f06314ab4e52493cc61359c9d42/examples/chat/conn.go#L50 + client.Conn.SetReadLimit(1024 * 1024) + //err := client.Conn.SetWriteDeadline(time.Now().Add(time.Millisecond * 50)) + //if err != nil { + // log.Printf("set deadline error: %v", err) + // return + //} + // TODO 1分钟后过期 for { // 阻塞读取消息 _, bytes, err := client.Conn.ReadMessage() if err != nil { - // 读失败 - log.Println("ReadMessage", err) - client.Close("read conn err:" + err.Error()) + // websocket.IsCloseError(err, websocket.CloseGoingAway) TODO 连接关闭,进行中游戏处理等逻辑 + if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { + log.Printf("error: %v", err) + } else { + // 读失败 + log.Printf("ReadMessage error: %T, %v", err, err) + client.Close("read conn err:" + err.Error()) + } return } diff --git a/internal/service/auth.go b/internal/service/auth.go index e152b92..ed564ba 100644 --- a/internal/service/auth.go +++ b/internal/service/auth.go @@ -141,7 +141,10 @@ func DecodeSubject(auth string) (*session.Subject, error) { if err != nil { return nil, err } - decode := security.DecryptAesCBC(bytes, aesTokenKeyBytes) + decode, err := security.DecryptAesCBC(bytes, aesTokenKeyBytes) + if err != nil { + return nil, err + } subject := &session.Subject{} err = json.Unmarshal(decode, subject) if err != nil { diff --git a/internal/service/table.go b/internal/service/table.go index 17278d6..2af3e45 100644 --- a/internal/service/table.go +++ b/internal/service/table.go @@ -32,7 +32,7 @@ func HandleReqCreateTable(account *session.NetAccount, msg *api.ReqCreateTable) PlayerNum: playerNum + 1, RobotNum: robotNum, - Players: make([]*game.Player, playerNum), + Players: make([]*game.Player, playerNum+1), Robots: make([]*game.Robot, robotNum), BigBlindsPos: 0, PlayersLock: &sync.Mutex{}, diff --git a/internal/session/net_client.go b/internal/session/net_client.go index a1efde6..1b393ad 100644 --- a/internal/session/net_client.go +++ b/internal/session/net_client.go @@ -6,6 +6,7 @@ import ( "github.com/gorilla/websocket" "log" "texas-poker-bk/api" + "time" ) // NetClient 长连接客户端 @@ -35,6 +36,12 @@ func (c *NetClient) WriteSeq(success bool, seq int32, msg proto.Message) { bytes, err := proto.Marshal(msg) wrap := &api.ProtoWrap{Ver: 1, Op: op, Seq: seq, Success: success, Body: bytes} wrapBytes, err := proto.Marshal(wrap) + // TODO 看文档 SetWriteDeadline + err = c.Conn.SetWriteDeadline(time.Now().Add(time.Millisecond * 100)) + if err != nil { + fmt.Println("set dead line err:", err) + return + } err = c.Conn.WriteMessage(websocket.BinaryMessage, wrapBytes) if err != nil { fmt.Println("write msg err:", err) diff --git a/tool/security/aes.go b/tool/security/aes.go index c1eb4d8..7dfafe0 100644 --- a/tool/security/aes.go +++ b/tool/security/aes.go @@ -31,7 +31,7 @@ func TestAes() { fmt.Println(encrypt) fmt.Println(base64.URLEncoding.EncodeToString(text)) - result := DecryptAesCBC(encrypt, key) + result, _ := DecryptAesCBC(encrypt, key) fmt.Println(string(result)) } @@ -74,14 +74,14 @@ func EncryptAesCBC(src, key []byte) ([]byte, error) { // DecryptAesCBC // src -> 要解密的密文 // key -> 秘钥, 和加密秘钥相同, 大小为: 8byte -func DecryptAesCBC(src, key []byte) []byte { +func DecryptAesCBC(src, key []byte) ([]byte, error) { // 1. 创建并返回一个使用DES算法的cipher.Block接口 block, err := aes.NewCipher(key) - blockSize := block.BlockSize() // 2. 判断是否创建成功 if err != nil { - panic(err) + return nil, err } + blockSize := block.BlockSize() // 3. 创建一个密码分组为链接模式的, 底层使用DES解密的BlockMode接口 iv := make([]byte, blockSize, blockSize) copy(iv, key) @@ -92,7 +92,7 @@ func DecryptAesCBC(src, key []byte) []byte { // 5. 去掉最后一组填充的数据 dst = pkcs5UnPadding(dst) // 6. 返回结果 - return dst + return dst, nil } // PKCS5Padding 使用pks5的方式填充