You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.3 KiB
63 lines
1.3 KiB
package session |
|
|
|
import ( |
|
"fmt" |
|
"github.com/golang/protobuf/proto" |
|
"github.com/gorilla/websocket" |
|
"log" |
|
"sync" |
|
"texas-poker-bk/api" |
|
"time" |
|
) |
|
|
|
// NetClient 长连接客户端 |
|
type NetClient struct { |
|
// Id int64 |
|
Conn *websocket.Conn |
|
Account *NetAccount |
|
WriteLock *sync.Mutex |
|
} |
|
|
|
func NewNetClient(conn *websocket.Conn) *NetClient { |
|
return &NetClient{ |
|
Conn: conn, |
|
WriteLock: new(sync.Mutex), |
|
} |
|
} |
|
|
|
func (c *NetClient) Close(reason string) { |
|
err := c.Conn.Close() |
|
if err != nil { |
|
log.Println("Close Error", err) |
|
} |
|
} |
|
|
|
func (c *NetClient) Write(msg proto.Message) { |
|
c.WriteSeq(true, 0, msg) |
|
} |
|
|
|
func (c *NetClient) WriteSeq(success bool, seq int32, msg proto.Message) { |
|
// 序列化 protobuf 消息 |
|
op, err := api.GetProtoOp(msg) |
|
if err != nil { |
|
fmt.Println("write msg match op err:", err, msg.String()) |
|
return |
|
} |
|
bytes, err := proto.Marshal(msg) |
|
wrap := &api.ProtoWrap{Ver: 1, Op: op, Seq: seq, Success: success, Body: bytes} |
|
wrapBytes, err := proto.Marshal(wrap) |
|
|
|
// 向ws客户端写 |
|
c.WriteLock.Lock() |
|
defer c.WriteLock.Unlock() |
|
// TODO 看文档 SetWriteDeadline |
|
err = c.Conn.SetWriteDeadline(time.Now().Add(10 * time.Second)) |
|
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) |
|
} |
|
}
|
|
|