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