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.
 
 
 

80 lines
1.7 KiB

package server
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"log"
"net/http"
"texas-poker-bk/internal/model"
"texas-poker-bk/internal/subject"
"time"
)
func Upgrade(ctx *gin.Context) {
conn, err := upgradeWs(ctx.Writer, ctx.Request)
if err != nil {
fmt.Println(err)
http.Error(ctx.Writer, "Not a websocket handshake", 400)
return
}
client := subject.NewNetClient(conn)
go handleNetClient(client)
}
func upgradeWs(resWriter http.ResponseWriter, req *http.Request) (*websocket.Conn, error) {
upgrader := websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
HandshakeTimeout: 3 * time.Second,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
return upgrader.Upgrade(resWriter, req, nil)
}
// 处理新建的websocket
func handleNetClient(client *subject.NetClient) {
//defer (func() {
// client.Close("conn finish")
//})()
// TODO 1分钟后过期
for {
// 阻塞读取消息
_, bytes, err := client.Conn.ReadMessage()
if err != nil {
// 读失败
log.Println("ReadMessage", err)
client.Close("read conn err:" + err.Error())
return
}
msg := &model.Message{}
err = json.Unmarshal(bytes, msg)
if err != nil {
log.Println("反序列化json消息失败", err)
continue
}
// TODO 认证消息(return -> account msg route)
switch msg.T {
case "identify":
param := &model.Identity{}
_ = json.Unmarshal(msg.D, param)
default:
client.Close("wrong message")
}
// TODO other,timeout -> close
}
}
// handleIdentity TODO 通过 token 认证连接的身份
func handleIdentity(identity *model.Identity, client *subject.NetClient) {
}