/** * Created by GoLand. * User: link1st * Date: 2019-07-27 * Time: 13:12 */ package websocket import ( "encoding/json" "fmt" "github.com/go-redis/redis" "gowebsocket/common" "gowebsocket/lib/cache" "gowebsocket/models" "time" ) // ping func PingController(client *Client, seq string, message []byte) (code uint32, msg string, data interface{}) { code = common.OK fmt.Println("webSocket_request ping接口", client.Addr, seq, message) data = "pong" return } // 用户登录 func LoginController(client *Client, seq string, message []byte) (code uint32, msg string, data interface{}) { code = common.OK currentTime := uint64(time.Now().Unix()) request := &models.Login{} if err := json.Unmarshal(message, request); err != nil { code = common.ParameterIllegal fmt.Println("用户登录 解析数据失败", seq, err) return } fmt.Println("webSocket_request 用户登录", seq, "ServiceToken", request.ServiceToken) // TODO::进行用户权限认证,一般是客户端传入TOKEN,然后检验TOKEN是否合法,通过TOKEN解析出来用户ID // 本项目只是演示,所以直接过去客户端传入的用户ID if request.UserId == "" || len(request.UserId) >= 20 { code = common.UnauthorizedUserId fmt.Println("用户登录 非法的用户", seq, request.UserId) return } if !InAppIds(request.AppId) { code = common.Unauthorized fmt.Println("用户登录 不支持的平台", seq, request.AppId) return } if client.IsLogin() { fmt.Println("用户登录 用户已经登录", client.AppId, client.UserId, seq) code = common.OperationFailure return } client.Login(request.AppId, request.UserId, currentTime) // 存储数据 userOnline := models.UserLogin(serverIp, serverPort, request.AppId, request.UserId, client.Addr, currentTime) err := cache.SetUserOnlineInfo(client.GetKey(), userOnline) if err != nil { code = common.ServerError fmt.Println("用户登录 SetUserOnlineInfo", seq, err) return } // 用户登录 login := &login{ AppId: request.AppId, UserId: request.UserId, Client: client, } clientManager.Login <- login fmt.Println("用户登录 成功", seq, client.Addr, request.UserId) return } // 心跳接口 func HeartbeatController(client *Client, seq string, message []byte) (code uint32, msg string, data interface{}) { code = common.OK currentTime := uint64(time.Now().Unix()) request := &models.HeartBeat{} if err := json.Unmarshal(message, request); err != nil { code = common.ParameterIllegal fmt.Println("心跳接口 解析数据失败", seq, err) return } fmt.Println("webSocket_request 心跳接口", client.AppId, client.UserId) if !client.IsLogin() { fmt.Println("心跳接口 用户未登录", client.AppId, client.UserId, seq) code = common.NotLoggedIn return } userOnline, err := cache.GetUserOnlineInfo(client.GetKey()) if err != nil { if err == redis.Nil { code = common.NotLoggedIn fmt.Println("心跳接口 用户未登录", seq, client.AppId, client.UserId) return } else { code = common.ServerError fmt.Println("心跳接口 GetUserOnlineInfo", seq, client.AppId, client.UserId, err) return } } client.Heartbeat(currentTime) userOnline.Heartbeat(currentTime) err = cache.SetUserOnlineInfo(client.GetKey(), userOnline) if err != nil { code = common.ServerError fmt.Println("心跳接口 SetUserOnlineInfo", seq, client.AppId, client.UserId, err) return } return }