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
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) { |
|
|
|
}
|
|
|