Browse Source

websocket write deadline

master
tangmingyou 4 years ago
parent
commit
4d1b5e866c
  1. 15
      internal/server/ws.go
  2. 5
      internal/service/auth.go
  3. 2
      internal/service/table.go
  4. 7
      internal/session/net_client.go
  5. 10
      tool/security/aes.go

15
internal/server/ws.go

@ -56,14 +56,27 @@ func handleNetClient(client *session.NetClient) {
//var account *session.NetAccount //var account *session.NetAccount
//var player *session.Player //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分钟后过期 // TODO 1分钟后过期
for { for {
// 阻塞读取消息 // 阻塞读取消息
_, bytes, err := client.Conn.ReadMessage() _, bytes, err := client.Conn.ReadMessage()
if err != nil { if err != nil {
// websocket.IsCloseError(err, websocket.CloseGoingAway) TODO 连接关闭,进行中游戏处理等逻辑
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("error: %v", err)
} else {
// 读失败 // 读失败
log.Println("ReadMessage", err) log.Printf("ReadMessage error: %T, %v", err, err)
client.Close("read conn err:" + err.Error()) client.Close("read conn err:" + err.Error())
}
return return
} }

5
internal/service/auth.go

@ -141,7 +141,10 @@ func DecodeSubject(auth string) (*session.Subject, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
decode := security.DecryptAesCBC(bytes, aesTokenKeyBytes) decode, err := security.DecryptAesCBC(bytes, aesTokenKeyBytes)
if err != nil {
return nil, err
}
subject := &session.Subject{} subject := &session.Subject{}
err = json.Unmarshal(decode, subject) err = json.Unmarshal(decode, subject)
if err != nil { if err != nil {

2
internal/service/table.go

@ -32,7 +32,7 @@ func HandleReqCreateTable(account *session.NetAccount, msg *api.ReqCreateTable)
PlayerNum: playerNum + 1, PlayerNum: playerNum + 1,
RobotNum: robotNum, RobotNum: robotNum,
Players: make([]*game.Player, playerNum), Players: make([]*game.Player, playerNum+1),
Robots: make([]*game.Robot, robotNum), Robots: make([]*game.Robot, robotNum),
BigBlindsPos: 0, BigBlindsPos: 0,
PlayersLock: &sync.Mutex{}, PlayersLock: &sync.Mutex{},

7
internal/session/net_client.go

@ -6,6 +6,7 @@ import (
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"log" "log"
"texas-poker-bk/api" "texas-poker-bk/api"
"time"
) )
// NetClient 长连接客户端 // NetClient 长连接客户端
@ -35,6 +36,12 @@ func (c *NetClient) WriteSeq(success bool, seq int32, msg proto.Message) {
bytes, err := proto.Marshal(msg) bytes, err := proto.Marshal(msg)
wrap := &api.ProtoWrap{Ver: 1, Op: op, Seq: seq, Success: success, Body: bytes} wrap := &api.ProtoWrap{Ver: 1, Op: op, Seq: seq, Success: success, Body: bytes}
wrapBytes, err := proto.Marshal(wrap) 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) err = c.Conn.WriteMessage(websocket.BinaryMessage, wrapBytes)
if err != nil { if err != nil {
fmt.Println("write msg err:", err) fmt.Println("write msg err:", err)

10
tool/security/aes.go

@ -31,7 +31,7 @@ func TestAes() {
fmt.Println(encrypt) fmt.Println(encrypt)
fmt.Println(base64.URLEncoding.EncodeToString(text)) fmt.Println(base64.URLEncoding.EncodeToString(text))
result := DecryptAesCBC(encrypt, key) result, _ := DecryptAesCBC(encrypt, key)
fmt.Println(string(result)) fmt.Println(string(result))
} }
@ -74,14 +74,14 @@ func EncryptAesCBC(src, key []byte) ([]byte, error) {
// DecryptAesCBC // DecryptAesCBC
// src -> 要解密的密文 // src -> 要解密的密文
// key -> 秘钥, 和加密秘钥相同, 大小为: 8byte // key -> 秘钥, 和加密秘钥相同, 大小为: 8byte
func DecryptAesCBC(src, key []byte) []byte { func DecryptAesCBC(src, key []byte) ([]byte, error) {
// 1. 创建并返回一个使用DES算法的cipher.Block接口 // 1. 创建并返回一个使用DES算法的cipher.Block接口
block, err := aes.NewCipher(key) block, err := aes.NewCipher(key)
blockSize := block.BlockSize()
// 2. 判断是否创建成功 // 2. 判断是否创建成功
if err != nil { if err != nil {
panic(err) return nil, err
} }
blockSize := block.BlockSize()
// 3. 创建一个密码分组为链接模式的, 底层使用DES解密的BlockMode接口 // 3. 创建一个密码分组为链接模式的, 底层使用DES解密的BlockMode接口
iv := make([]byte, blockSize, blockSize) iv := make([]byte, blockSize, blockSize)
copy(iv, key) copy(iv, key)
@ -92,7 +92,7 @@ func DecryptAesCBC(src, key []byte) []byte {
// 5. 去掉最后一组填充的数据 // 5. 去掉最后一组填充的数据
dst = pkcs5UnPadding(dst) dst = pkcs5UnPadding(dst)
// 6. 返回结果 // 6. 返回结果
return dst return dst, nil
} }
// PKCS5Padding 使用pks5的方式填充 // PKCS5Padding 使用pks5的方式填充

Loading…
Cancel
Save