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.

154 lines
3.5 KiB

/**
* Created by GoLand.
* User: link1st
* Date: 2019-08-03
* Time: 16:43
*/
package grpcserver
import (
"context"
"fmt"
"github.com/golang/protobuf/proto"
"github.com/spf13/viper"
"google.golang.org/grpc"
"gowebsocket/common"
"gowebsocket/models"
"gowebsocket/protobuf"
"gowebsocket/servers/websocket"
"log"
"net"
)
type server struct {
}
func setErr(rsp proto.Message, code uint32, message string) {
message = common.GetErrorMessage(code, message)
switch v := rsp.(type) {
case *protobuf.QueryUsersOnlineRsp:
v.RetCode = code
v.ErrMsg = message
case *protobuf.SendMsgRsp:
v.RetCode = code
v.ErrMsg = message
case *protobuf.SendMsgAllRsp:
v.RetCode = code
v.ErrMsg = message
case *protobuf.GetUserListRsp:
v.RetCode = code
v.ErrMsg = message
default:
}
}
// 查询用户是否在线
func (s *server) QueryUsersOnline(c context.Context, req *protobuf.QueryUsersOnlineReq) (rsp *protobuf.QueryUsersOnlineRsp, err error) {
fmt.Println("grpc_request 查询用户是否在线", req.String())
rsp = &protobuf.QueryUsersOnlineRsp{}
online := websocket.CheckUserOnline(req.GetAppId(), req.GetUserId())
setErr(req, common.OK, "")
rsp.Online = online
return rsp, nil
}
// 给本机用户发消息
func (s *server) SendMsg(c context.Context, req *protobuf.SendMsgReq) (rsp *protobuf.SendMsgRsp, err error) {
fmt.Println("grpc_request 给本机用户发消息", req.String())
rsp = &protobuf.SendMsgRsp{}
if req.GetIsLocal() {
// 不支持
setErr(rsp, common.ParameterIllegal, "")
return
}
data := models.GetMsgData(req.GetUserId(), req.GetSeq(), req.GetCms(), req.GetMsg())
sendResults, err := websocket.SendUserMessageLocal(req.GetAppId(), req.GetUserId(), data)
if err != nil {
fmt.Println("系统错误", err)
setErr(rsp, common.ServerError, "")
return rsp, nil
}
if !sendResults {
fmt.Println("发送失败", err)
setErr(rsp, common.OperationFailure, "")
return rsp, nil
}
setErr(rsp, common.OK, "")
fmt.Println("grpc_response 给本机用户发消息", rsp.String())
return
}
// 给本机全体用户发消息
func (s *server) SendMsgAll(c context.Context, req *protobuf.SendMsgAllReq) (rsp *protobuf.SendMsgAllRsp, err error) {
fmt.Println("grpc_request 给本机全体用户发消息", req.String())
rsp = &protobuf.SendMsgAllRsp{}
data := models.GetMsgData(req.GetUserId(), req.GetSeq(), req.GetCms(), req.GetMsg())
websocket.AllSendMessages(req.GetAppId(), req.GetUserId(), data)
setErr(rsp, common.OK, "")
fmt.Println("grpc_response 给本机全体用户发消息:", rsp.String())
return
}
// 获取本机用户列表
func (s *server) GetUserList(c context.Context, req *protobuf.GetUserListReq) (rsp *protobuf.GetUserListRsp, err error) {
fmt.Println("grpc_request 获取本机用户列表", req.String())
appId := req.GetAppId()
rsp = &protobuf.GetUserListRsp{}
// 本机
userList := websocket.GetUserList(appId)
setErr(rsp, common.OK, "")
rsp.UserId = userList
fmt.Println("grpc_response 获取本机用户列表:", rsp.String())
return
}
// rpc server
// link::https://github.com/grpc/grpc-go/blob/master/examples/helloworld/greeter_server/main.go
func Init() {
rpcPort := viper.GetString("app.rpcPort")
fmt.Println("rpc server 启动", rpcPort)
lis, err := net.Listen("tcp", ":"+rpcPort)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
protobuf.RegisterAccServerServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}