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.

109 lines
2.0 KiB

/**
* Created by GoLand.
* User: link1st
* Date: 2019-07-27
* Time: 14:38
*/
package websocket
import (
"encoding/json"
"fmt"
"gowebsocket/common"
"gowebsocket/models"
"sync"
)
type DisposeFunc func(client *Client, seq string, message []byte) (code uint32, msg string, data interface{})
var (
handlers = make(map[string]DisposeFunc)
handlersRWMutex sync.RWMutex
)
// 注册
func Register(key string, value DisposeFunc) {
handlersRWMutex.Lock()
defer handlersRWMutex.Unlock()
handlers[key] = value
return
}
func getHandlers(key string) (value DisposeFunc, ok bool) {
handlersRWMutex.RLock()
defer handlersRWMutex.RUnlock()
value, ok = handlers[key]
return
}
// 处理数据
func ProcessData(client *Client, message []byte) {
fmt.Println("处理数据", client.Addr, string(message))
defer func() {
if r := recover(); r != nil {
fmt.Println("处理数据 stop", r)
}
}()
request := &models.Request{}
err := json.Unmarshal(message, request)
if err != nil {
fmt.Println("处理数据 json Unmarshal", err)
client.SendMsg([]byte("数据不合法"))
return
}
requestData, err := json.Marshal(request.Data)
if err != nil {
fmt.Println("处理数据 json Marshal", err)
client.SendMsg([]byte("处理数据失败"))
return
}
seq := request.Seq
cmd := request.Cmd
var (
code uint32
msg string
data interface{}
)
// request
fmt.Println("acc_request", cmd, client.Addr)
// 采用 map 注册的方式
if value, ok := getHandlers(cmd); ok {
code, msg, data = value(client, seq, requestData)
} else {
code = common.RoutingNotExist
fmt.Println("处理数据 路由不存在", client.Addr, "cmd", cmd)
}
msg = common.GetErrorMessage(code, msg)
responseHead := models.NewResponseHead(seq, cmd, code, msg, data)
headByte, err := json.Marshal(responseHead)
if err != nil {
fmt.Println("处理数据 json Marshal", err)
return
}
client.SendMsg(headByte)
fmt.Println("acc_response send", client.Addr, client.AppId, client.UserId, "cmd", cmd, "code", code)
return
}