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