diff --git a/actions/AccountAction.go b/actions/AccountAction.go deleted file mode 100644 index dfea98c..0000000 --- a/actions/AccountAction.go +++ /dev/null @@ -1,59 +0,0 @@ -package actions - -import ( - "context" - "fmt" - "pro2d/components/jwt" - "pro2d/conf" - "pro2d/models" - "pro2d/protos/pb" - "pro2d/utils" -) - -func (s *LoginServer) RegisterHandler(ctx context.Context, in *pb.Register) (*pb.RegisterRsp, error) { - ok, account := models.AccountExistByPhone(in.Phone) - if !ok { - account.Phone = in.Phone - account.Password = utils.Md5V(in.Password) - account.Uid = conf.SnowFlack.NextValStr() - account.Create() - }else { - return nil, fmt.Errorf("1") - } - - return &pb.RegisterRsp{ - Code: 0, - }, nil -} - -func (s *LoginServer) CreateTokenHandler(ctx context.Context, in *pb.Account) (*pb.CreateTokenRsp, error) { - m := models.NewAccount(in.Phone) - if err := m.Load(); err != nil { - return &pb.CreateTokenRsp{ - Code: 1, - }, nil - } - - if m.Password != utils.Md5V(in.Password) { - return &pb.CreateTokenRsp{ - Code: 2, - }, nil - } - - serverInfo := s.EtcdClient.GetByPrefix(conf.GlobalConf.GameConf.Name) - var gameInfo []*pb.ServiceInfo - for k, v := range serverInfo { - gameInfo = append(gameInfo, &pb.ServiceInfo{ - Id: k, - Name: conf.GlobalConf.GameConf.Name, - Address: v, - }) - } - - return &pb.CreateTokenRsp{ - Code: 0, - Uid: m.Uid, - Token: jwt.CreateToken(m.Account.Uid), - GameService: gameInfo, - }, nil -} diff --git a/actions/RoleAction.go b/actions/RoleAction.go deleted file mode 100644 index ecf90ff..0000000 --- a/actions/RoleAction.go +++ /dev/null @@ -1,55 +0,0 @@ -package actions - -import ( - "context" - "errors" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/types/known/emptypb" - "pro2d/conf" - "pro2d/models" - "pro2d/protos/pb" - "pro2d/utils" -) - -func (s *GameServer) HeartBeatHandler(ctx context.Context, empty *emptypb.Empty) (*pb.HeartRsp, error) { - utils.Sugar.Debugf("HeartBeatHandler被调用!!!") - //获取元数据信息 - _,ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil,errors.New("未传输token") - } - - return &pb.HeartRsp{ - Code: 0, - }, nil -} - -func (s *GameServer) CreateRoleHandler(ctx context.Context, in *pb.LoginReq) (*pb.RoleRsp, error) { - uid := ctx.Value("uid").(string) - ok, role := models.RoleExistByUid(uid) - if !ok { - role = models.NewRole(conf.SnowFlack.NextVal()) - role.Role.Device = in.Device - role.Role.Uid = uid - role.Create() - } - return &pb.RoleRsp{ - Code: 0, - Role: role.Role, - }, nil -} - -func (s *GameServer) LoginHandler(ctx context.Context, in *pb.LoginReq) (*pb.RoleRsp, error) { - uid := ctx.Value("uid").(string) - ok, role := models.RoleExistByUid(uid) - if !ok { - return &pb.RoleRsp{ - Code: 1, - }, nil - } - return &pb.RoleRsp{ - Code: 0, - Role: role.Role, - Hero: models.GetHeros(role.Heros), - }, nil -} diff --git a/actions/basic.go b/actions/basic.go deleted file mode 100644 index b123bb4..0000000 --- a/actions/basic.go +++ /dev/null @@ -1,44 +0,0 @@ -package actions - -import ( - "fmt" - "google.golang.org/grpc" - "net" - "pro2d/components/db" - "pro2d/components/etcd" - "pro2d/conf" - "pro2d/utils" -) - -type BasicServer struct { - SConf *conf.SConf - EtcdClient *etcd.EtcdClient - GrpcServer *grpc.Server -} - -func NewServer() *BasicServer { - return &BasicServer{} -} - -func (b *BasicServer) Start(sConf *conf.SConf) (net.Listener, error) { - b.SConf = sConf - - //初始化数据库 - db.MongoDatabase = db.MongoClient.Database(sConf.DBName) - //初始化etcd - b.EtcdClient = etcd.NewEtcdClient(conf.GlobalConf.Etcd) - b.EtcdClient.PutWithLeasePrefix(sConf.Name, sConf.ID, fmt.Sprintf("%s:%d", sConf.IP, sConf.Port), 10) - - listing := fmt.Sprintf(":%d", sConf.Port) - lis, err := net.Listen("tcp", listing) - if err != nil { - return nil, err - } - return lis, err -} - -func (b *BasicServer) Stop() { - utils.Sugar.Debugf("平滑关闭服务") - b.EtcdClient.Close() - b.GrpcServer.GracefulStop() -} diff --git a/actions/server.go b/actions/server.go deleted file mode 100644 index f60b236..0000000 --- a/actions/server.go +++ /dev/null @@ -1,137 +0,0 @@ -package actions - -import ( - "context" - "fmt" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/reflection" - "pro2d/components/jwt" - "pro2d/conf" - "pro2d/models" - "pro2d/protos/pb" - "pro2d/utils" -) - -type LoginServer struct{ - pb.UnsafeLoginServer - *BasicServer -} - -func NewAccountServer() *LoginServer { - return &LoginServer{ - BasicServer: NewServer(), - } -} - -//拦截器 -func AccountServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, - handler grpc.UnaryHandler) (interface{}, error) { - - utils.Sugar.Debugf("gRPC method: %s, %v", info.FullMethod, req) - resp, err := handler(ctx, req) - return resp, err -} - -func (s *LoginServer)Start() error { - lis, err := s.BasicServer.Start(conf.GlobalConf.AccountConf) - if err != nil { - return err - } - - models.InitAccountServerModels() - - var opts []grpc.ServerOption - - if conf.GlobalConf.TLS.Status { - //TLS - creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key") - if err != nil { - utils.Sugar.Errorf("Failed to generate credentials %v", err) - return err - } - opts = append(opts, grpc.Creds(creds)) - } - - //拦截器 - opts = append(opts, grpc.UnaryInterceptor(AccountServerInterceptor)) - - //new一个grpc - s.GrpcServer = grpc.NewServer(opts...) - - pb.RegisterLoginServer(s.GrpcServer, s) - reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 - - // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 - // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 - utils.Sugar.Debugf("Start LoginServer listening on %d with TLS", conf.GlobalConf.AccountConf.Port) - - return s.GrpcServer.Serve(lis) -} - -func (s *LoginServer)Stop() { - s.BasicServer.Stop() -} - -type GameServer struct{ - pb.UnimplementedGameServer - *BasicServer -} - -func NewGameServer() *GameServer { - return &GameServer{ - BasicServer: NewServer(), - } -} -//拦截器 -func GameServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, - handler grpc.UnaryHandler) (interface{}, error) { - - //utils.Sugar.Debugf("gRPC method: %s, %v", info.FullMethod, req) - uid := jwt.CheckAuth(ctx) - if uid == ""{ - return nil, fmt.Errorf("token error") - } - context.WithValue(ctx, "uid", uid) - resp, err := handler(ctx, req) - return resp, err -} - -func (s *GameServer)Start() error { - lis, err := s.BasicServer.Start(conf.GlobalConf.GameConf) - if err != nil { - return err - } - - models.InitGameServerModels() - - var opts []grpc.ServerOption - //TLS - if conf.GlobalConf.TLS.Status { - //TLS - creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key") - if err != nil { - utils.Sugar.Errorf("Failed to generate credentials %v", err) - return err - } - opts = append(opts, grpc.Creds(creds)) - } - - //拦截器 - opts = append(opts, grpc.UnaryInterceptor(GameServerInterceptor)) - - //new一个grpc - s.GrpcServer = grpc.NewServer(opts...) - - pb.RegisterGameServer(s.GrpcServer, s) - reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 - - // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 - // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 - utils.Sugar.Debugf("Start GameServer listening on %d with TLS", conf.GlobalConf.GameConf.Port) - return s.GrpcServer.Serve(lis) -} - -func (s *GameServer)Stop() { - s.BasicServer.Stop() -} \ No newline at end of file diff --git a/cmd/account.go b/cmd/account.go deleted file mode 100644 index 15ca376..0000000 --- a/cmd/account.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "os" - "os/signal" - "pro2d/actions" - "pro2d/utils" - "syscall" -) - -func main() { - err := make(chan error) - stopChan := make(chan os.Signal) - signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) - - server := actions.NewAccountServer() - go func() { - err <- server.Start() - }() - - - select { - case e := <- err: - utils.Sugar.Errorf("game server error: %v", e) - case <-stopChan: - // 平滑关闭服务 - server.Stop() - } -} diff --git a/cmd/game.go b/cmd/game.go deleted file mode 100644 index 45825fd..0000000 --- a/cmd/game.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "os" - "os/signal" - "pro2d/actions" - "pro2d/utils" - "syscall" -) - -func main() { - err := make(chan error) - stopChan := make(chan os.Signal) - signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) - - server := actions.NewGameServer() - go func() { - err <- server.Start() - }() - - - select { - case e := <- err: - utils.Sugar.Errorf("game server error: %v", e) - case <-stopChan: - // 平滑关闭服务 - server.Stop() - } -} diff --git a/cmd/server.go b/cmd/server.go new file mode 100644 index 0000000..7db89e4 --- /dev/null +++ b/cmd/server.go @@ -0,0 +1,28 @@ +package main + +import ( + "os" + "os/signal" + "pro2d/components/net" + "pro2d/conf" + "pro2d/utils" + "syscall" +) + +func main() { + err := make(chan error) + stopChan := make(chan os.Signal) + signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) + + s := net.NewServer(conf.GlobalConf.GameConf) + go func() { + err <- s.Start() + }() + + select { + case e := <- err: + utils.Sugar.Errorf("game server error: %v", e) + case <-stopChan: + s.Stop() + } +} diff --git a/common/common.go b/common/common.go new file mode 100644 index 0000000..106facd --- /dev/null +++ b/common/common.go @@ -0,0 +1,5 @@ +package common + +const ( + HEADLEN = 8 +) diff --git a/components/net/conn.go b/components/net/conn.go new file mode 100644 index 0000000..f3e9ba4 --- /dev/null +++ b/components/net/conn.go @@ -0,0 +1,105 @@ +package net + +import ( + "bufio" + "fmt" + "net" +) + +type Head struct { + Length int32 + Cmd int32 + ErrCode int32 + PreField int32 +} + + +type Connection struct { + net.Conn + Id int + Server *Server + + scanner *bufio.Scanner + writer *bufio.Writer + + WBuffer chan []byte + RBuffer chan *MsgPkg + + Quit chan *Connection +} + +type MsgPkg struct { + Head Head + Body []byte + Conn *Connection +} + +func NewConn(id int, conn net.Conn, s *Server) *Connection { + return &Connection{ + Id: id, + Conn: conn, + Server: s, + + scanner: bufio.NewScanner(conn), + writer: bufio.NewWriter(conn), + WBuffer: make(chan []byte), + RBuffer: make(chan *MsgPkg), + Quit: make(chan *Connection), + } +} + +func (c *Connection) write() { + defer c.Quiting() + + for msg := range c.WBuffer { + if _, err := c.writer.Write(msg); err != nil { + fmt.Println("write fail err: " + err.Error()) + return + } + if err := c.writer.Flush(); err != nil { + fmt.Println("write Flush fail err: " + err.Error()) + return + } + } +} + +func (c *Connection) read() { + defer c.Quiting() + for { + c.scanner.Split(ParseMsg) + + for c.scanner.Scan() { + req, err := DecodeMsg(c.scanner.Bytes()) + if err != nil { + return + } + + req.Conn = c + c.Server.OnRecv(req) + } + + if err := c.scanner.Err(); err != nil { + fmt.Printf("scanner.err: %s\n", err.Error()) + c.Quiting() + return + } + } +} + +func (c *Connection) Start() { + go c.write() + go c.read() +} + +func (c *Connection) Stop() { + close(c.RBuffer) + close(c.WBuffer) + c.Conn.Close() +} + +func (c *Connection) Quiting() { + c.Server.OnClose(c) +} + +func (c *Connection) SendMsg(){ +} \ No newline at end of file diff --git a/components/net/msg.go b/components/net/msg.go new file mode 100644 index 0000000..b5b998c --- /dev/null +++ b/components/net/msg.go @@ -0,0 +1,43 @@ +package net + +import ( + "bytes" + "encoding/binary" + "fmt" + "pro2d/common" +) + +func ParseMsg (data []byte, atEOF bool) (advance int, token []byte, err error) { + // 表示我们已经扫描到结尾了 + if atEOF && len(data) == 0 { + return 0, nil, nil + } + if !atEOF && len(data) >= common.HEADLEN { //4字节数据包长度 4字节指令 + length := int32(0) + binary.Read(bytes.NewReader(data[0:4]), binary.BigEndian, &length) + if length <= 0 { + return 0, nil, fmt.Errorf("length is 0") + } + if int(length) <= len(data) { + return int(length) , data[:int(length)], nil + } + return 0 , nil, nil + } + if atEOF { + return len(data), data, nil + } + return 0, nil, nil +} + + +func DecodeMsg(data []byte) (*MsgPkg, error) { + h := Head{} + err := binary.Read(bytes.NewReader(data), binary.BigEndian, &h) + if err != nil { + return nil, err + } + return &MsgPkg{ + Head: h, + Body: data[common.HEADLEN:], + },nil +} diff --git a/components/net/server.go b/components/net/server.go new file mode 100644 index 0000000..5193b2c --- /dev/null +++ b/components/net/server.go @@ -0,0 +1,56 @@ +package net + +import ( + "fmt" + "net" + "pro2d/conf" + "pro2d/utils" + "sync" +) + +type Server struct { + SConf *conf.SConf + Clients *sync.Map + +} + +func NewServer(sConf *conf.SConf) *Server { + return &Server{ + SConf: sConf, + Clients: new(sync.Map), + } +} + +func (s *Server) OnRecv(msg *MsgPkg) { + utils.Sugar.Debugf("cmd: %d, data: %s", msg.Head.Cmd, msg.Body) +} + +func (s *Server) OnClose(conn *Connection) { + s.Clients.Delete(conn.Id) +} + +func (s *Server)Start() error { + port := fmt.Sprintf(":%d", s.SConf.Port) + l, err := net.Listen("tcp", port) + if err != nil { + return err + } + + utils.Sugar.Debugf("listen on %s\n", port) + id := 0 + for { + conn, err := l.Accept() + if err != nil { + return err + } + + id++ + client := NewConn(id, conn, s) + s.Clients.Store(id, client) + go client.Start() + } +} + +func (s *Server)Stop() { +} + diff --git a/doc/proto.md b/doc/proto.md new file mode 100644 index 0000000..72e3201 --- /dev/null +++ b/doc/proto.md @@ -0,0 +1,13 @@ + +## 包 +包 = 包头 + 包体 + +## 包头 +| |类型|长度| 描述| +|---|---|---|---| +|包长度|int32|4字节| 包头(16字节) + 包体长度| +|协议号|int32|4字节| | +|错误码|int32|4字节|| +|预留字段|int32|4字节|| + +## 包体 \ No newline at end of file diff --git a/test/client.go b/test/client.go index 1cd76b8..7b651de 100644 --- a/test/client.go +++ b/test/client.go @@ -1,134 +1,47 @@ -//参考:https://jergoo.gitbooks.io/go-grpc-practice-guide/content/chapter2/interceptor.html - package main import ( - "context" - "fmt" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "pro2d/components/jwt" - _ "pro2d/conf" - "pro2d/protos/pb" + "bytes" + "encoding/binary" + "net" + net2 "pro2d/components/net" "pro2d/utils" ) -func Register(c pb.LoginClient, phone, password string) error { - r, err := c.RegisterHandler(context.Background(), &pb.Register{ - Phone: "17683852936", - Password: "123456", - Code: 0, - }) +func main() { - if err != nil { - return err - } - if r.Code != 0 { - return fmt.Errorf("register fail") + head := net2.Head{ + Length: 0, + Cmd: 1, + ErrCode: 0, + PreField: 0, } - utils.Sugar.Debug("register success") - return nil -} -func Login(loginUri, token, uid string) { - var opts []grpc.DialOption - // 指定自定义认证 - opts = append(opts, grpc.WithPerRPCCredentials(&jwt.AuthToken{Token: token})) - if TLS { - // TLS连接 - creds, err := credentials.NewClientTLSFromFile("keys/server.pem", ServerName) - if err != nil { - utils.Sugar.Fatalf("Failed to create TLS credentials %v", err) - return - } - opts = append(opts, grpc.WithTransportCredentials(creds)) - }else{ - opts = append(opts, grpc.WithInsecure()) + b := net2.MsgPkg{ + Head: head, + Body: []byte("hello world"), } - - gameConn, err := grpc.Dial(loginUri, opts...) + head.Length = int32(16 + len(b.Body)) + buf := &bytes.Buffer{} + err := binary.Write(buf, binary.BigEndian, head) if err != nil { - utils.Sugar.Errorf("game conn err: %v", err) + utils.Sugar.Errorf("err: %v, head: %v", err, head) return } - defer gameConn.Close() - - client:= pb.NewGameClient(gameConn) - var role *pb.Role - loginRsp, err := client.LoginHandler(context.Background(), &pb.LoginReq{ - Device: "111111", - }) + utils.Sugar.Debugf("head: %v", head) + err = binary.Write(buf, binary.BigEndian, b.Body) if err != nil { - utils.Sugar.Errorf("login error: %v", err) + utils.Sugar.Errorf("err: %v, msg: %v", err, b.Body) return } - role = loginRsp.Role - - if loginRsp.Code != 0 { - utils.Sugar.Debugf("login fail, role not exist") - createRole, err := client.CreateRoleHandler(context.Background(), &pb.LoginReq{Device: "11111"}) - if err != nil { - utils.Sugar.Errorf("create role err: %v", err) - return - } - utils.Sugar.Debug("create role rsp: ", createRole.Code) - role = createRole.Role - } - - utils.Sugar.Debugf("login successful role: %v", role) -} - -const ( - TLS = true - ServerName = "pro2d" -) - -func main() { - - var opts []grpc.DialOption - if TLS { - // TLS连接 - creds, err := credentials.NewClientTLSFromFile("keys/server.pem", ServerName) - if err != nil { - utils.Sugar.Fatalf("Failed to create TLS credentials %v", err) - return - } - opts = append(opts, grpc.WithTransportCredentials(creds)) - - }else{ - opts = append(opts, grpc.WithInsecure()) - } - - conn, err := grpc.Dial("localhost:8848", opts...) - if err != nil { - utils.Sugar.Errorf("conn err: %v", err) - return - } - defer conn.Close() - c := pb.NewLoginClient(conn) - //err = Register(c,"17683852936", "123456") - //if err != nil { - // utils.Sugar.Errorf("register err: %v", err) - // return - //} - rsp, err := c.CreateTokenHandler(context.Background(), &pb.Account{ - Phone: "17683852936", - Password: "123456", - }) + client, err := net.Dial("tcp", "localhost:8849") if err != nil { - utils.Sugar.Errorf("createtoken err: %v", err) - return - } - - if rsp.Code != 0 { - utils.Sugar.Errorf("createtoken err" ) + utils.Sugar.Error(err) return } - - if len(rsp.GameService) >0 { - Login(rsp.GameService[0].Address, rsp.Token, rsp.Uid) - } + client.Write(buf.Bytes()) + select {} } \ No newline at end of file diff --git a/test/tlsclient.go b/test/tlsclient.go deleted file mode 100644 index f5a4e6e..0000000 --- a/test/tlsclient.go +++ /dev/null @@ -1,64 +0,0 @@ -package main - -import ( - "context" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/protobuf/types/known/emptypb" - "log" - "pro2d/components/jwt" - _ "pro2d/conf" - "pro2d/protos/pb" - "pro2d/utils" -) -// AuthToken 自定义认证 客户端使用 -type CustomToken struct { -} - -func (c CustomToken) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - return map[string]string{ - "appId": "100", - "appKey": "token", - }, nil -} - -func (c CustomToken) RequireTransportSecurity() bool { - return true -} - -func main() { - var opts []grpc.DialOption - creds, err := credentials.NewClientTLSFromFile("keys/server.pem", "pro2d") - if err != nil { - log.Fatal(err) - return - } - opts = append(opts, grpc.WithTransportCredentials(creds)) - conn, err := grpc.Dial("localhost:8948", opts...) - - helloClient := pb.NewHelloClient(conn) - token, err := helloClient.CreateToken(context.TODO(), &pb.Login{ - Login: "login", - Password: "123456", - }) - if err != nil { - log.Fatal(err) - return - } - utils.Sugar.Debugf("token: %s", token.Token) - - opts = append(opts, grpc.WithPerRPCCredentials(&jwt.AuthToken{Token: token.Token})) - conn2, err := grpc.Dial("localhost:8948",opts...) - if err != nil { - log.Fatal(err) - return - } - - helloClient2 := pb.NewHelloClient(conn2) - rsp, err := helloClient2.SayHello(context.TODO(), &emptypb.Empty{}) - if err != nil { - log.Fatal(err) - } - - log.Printf("sayhello rsp: %v", rsp) -} diff --git a/test/tlsserver.go b/test/tlsserver.go deleted file mode 100644 index bc719ae..0000000 --- a/test/tlsserver.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "context" - "fmt" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" - "log" - "net" - "pro2d/components/jwt" - "pro2d/protos/pb" -) - -type Server struct { - pb.UnimplementedHelloServer -} - -func (s *Server) CreateToken(ctx context.Context, in *pb.Login) (*pb.TokenInfo, error) { - if in.Login == "login" && in.Password == "123456" { - return &pb.TokenInfo{Token: jwt.CreateToken(in.Login)}, nil - } - return nil, fmt.Errorf("login error") -} - -//func (s *Server) SayHello(ctx context.Context, empty *emptypb.Empty) (*pb.HelloWorld, error) { -// md, ok := metadata.FromIncomingContext(ctx) -// if !ok { -// return nil, status.Errorf(codes.Unauthenticated,"ErrNoMetadataInContext") -// } -// // md 的类型是 type MD map[string][]string -// token, ok := md["authorization"] -// if !ok || len(token) == 0 { -// return nil, status.Errorf(codes.Unauthenticated,"ErrNoAuthorizationInMetadata") -// } -// login := jwt.ParseToken(token[0]) -// return &pb.HelloWorld{Msg: "Hello world: " + login}, nil -//} - -func (s *Server) SayHello(ctx context.Context, empty *emptypb.Empty) (*pb.HelloWorld, error) { - md, ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil, status.Errorf(codes.Unauthenticated, "无Token认证信息") - } - var ( - appId string - appKey string - ) - if val, ok := md["appid"]; ok { - appId = val[0] - } - - if val, ok := md["appkey"]; ok { - appKey = val[0] - } - - if appId != "100" || appKey != "token" { - return nil, status.Errorf(codes.Unauthenticated, "Token认证信息无效: appid=%s, appkey=%s", appId, appKey) - } - - return &pb.HelloWorld{Msg: "Hello world"}, nil -} -func main() { - // 监听本地端口 - listener, err := net.Listen("tcp", ":8948") - if err != nil { - log.Fatalf("net.Listen err: %v", err) - } - var opts []grpc.ServerOption - // 从输入证书文件和密钥文件为服务端构造TLS凭证 - creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key") - if err != nil { - log.Fatalf("Failed to generate credentials %v", err) - } - opts = append(opts, grpc.Creds(creds)) - // 新建gRPC服务器实例,并开启TLS认证 - grpcServer := grpc.NewServer(opts...) - - // 在gRPC服务器注册我们的服务 - pb.RegisterHelloServer(grpcServer, &Server{}) - log.Println(" net.Listing whth TLS") - //用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用 - err = grpcServer.Serve(listener) - if err != nil { - log.Fatalf("grpcServer.Serve err: %v", err) - } -} \ No newline at end of file diff --git a/tools/csvtostruct.go b/tools/csvtostruct.go index 77b7c09..e03a497 100644 --- a/tools/csvtostruct.go +++ b/tools/csvtostruct.go @@ -154,7 +154,7 @@ func (g *Generate)CsvToMem(csvpath, filename string) error { //4行之后 fields := sheetData[1] typs := sheetData[2] //int, string - //keys := sheetData[3] //all, s, c + keys := sheetData[3] //all, key, key1, key2 t := reflect.ValueOf(csvdata.CsvStruct[name]).Type() v := reflect.New(t).Elem() @@ -175,9 +175,19 @@ func (g *Generate)CsvToMem(csvpath, filename string) error { f.SetString(record[idx]) } + switch keys[idx] { + case "all": + case "key": + case "key1": + + case "key2": + default: + + } + //fmt.Printf("%d, %s: %v, %v\n", idx, firstRuneToUpper(field), v.Field(idx), v.Interface()) - csvdata.SetCsv(name, v.Interface()) } + csvdata.SetCsv(name, datam) } i++ } -- libgit2 0.21.2