Commit fee11bff674b0bfb9535ccc11a886cdaac37c2df

Authored by zhangqijia
1 parent 11abbdea

客户端无法使用grpc热更,不用grpc,定义包头使用长连接

actions/AccountAction.go deleted
@@ -1,59 +0,0 @@ @@ -1,59 +0,0 @@
1 -package actions  
2 -  
3 -import (  
4 - "context"  
5 - "fmt"  
6 - "pro2d/components/jwt"  
7 - "pro2d/conf"  
8 - "pro2d/models"  
9 - "pro2d/protos/pb"  
10 - "pro2d/utils"  
11 -)  
12 -  
13 -func (s *LoginServer) RegisterHandler(ctx context.Context, in *pb.Register) (*pb.RegisterRsp, error) {  
14 - ok, account := models.AccountExistByPhone(in.Phone)  
15 - if !ok {  
16 - account.Phone = in.Phone  
17 - account.Password = utils.Md5V(in.Password)  
18 - account.Uid = conf.SnowFlack.NextValStr()  
19 - account.Create()  
20 - }else {  
21 - return nil, fmt.Errorf("1")  
22 - }  
23 -  
24 - return &pb.RegisterRsp{  
25 - Code: 0,  
26 - }, nil  
27 -}  
28 -  
29 -func (s *LoginServer) CreateTokenHandler(ctx context.Context, in *pb.Account) (*pb.CreateTokenRsp, error) {  
30 - m := models.NewAccount(in.Phone)  
31 - if err := m.Load(); err != nil {  
32 - return &pb.CreateTokenRsp{  
33 - Code: 1,  
34 - }, nil  
35 - }  
36 -  
37 - if m.Password != utils.Md5V(in.Password) {  
38 - return &pb.CreateTokenRsp{  
39 - Code: 2,  
40 - }, nil  
41 - }  
42 -  
43 - serverInfo := s.EtcdClient.GetByPrefix(conf.GlobalConf.GameConf.Name)  
44 - var gameInfo []*pb.ServiceInfo  
45 - for k, v := range serverInfo {  
46 - gameInfo = append(gameInfo, &pb.ServiceInfo{  
47 - Id: k,  
48 - Name: conf.GlobalConf.GameConf.Name,  
49 - Address: v,  
50 - })  
51 - }  
52 -  
53 - return &pb.CreateTokenRsp{  
54 - Code: 0,  
55 - Uid: m.Uid,  
56 - Token: jwt.CreateToken(m.Account.Uid),  
57 - GameService: gameInfo,  
58 - }, nil  
59 -}  
actions/RoleAction.go deleted
@@ -1,55 +0,0 @@ @@ -1,55 +0,0 @@
1 -package actions  
2 -  
3 -import (  
4 - "context"  
5 - "errors"  
6 - "google.golang.org/grpc/metadata"  
7 - "google.golang.org/protobuf/types/known/emptypb"  
8 - "pro2d/conf"  
9 - "pro2d/models"  
10 - "pro2d/protos/pb"  
11 - "pro2d/utils"  
12 -)  
13 -  
14 -func (s *GameServer) HeartBeatHandler(ctx context.Context, empty *emptypb.Empty) (*pb.HeartRsp, error) {  
15 - utils.Sugar.Debugf("HeartBeatHandler被调用!!!")  
16 - //获取元数据信息  
17 - _,ok := metadata.FromIncomingContext(ctx)  
18 - if !ok {  
19 - return nil,errors.New("未传输token")  
20 - }  
21 -  
22 - return &pb.HeartRsp{  
23 - Code: 0,  
24 - }, nil  
25 -}  
26 -  
27 -func (s *GameServer) CreateRoleHandler(ctx context.Context, in *pb.LoginReq) (*pb.RoleRsp, error) {  
28 - uid := ctx.Value("uid").(string)  
29 - ok, role := models.RoleExistByUid(uid)  
30 - if !ok {  
31 - role = models.NewRole(conf.SnowFlack.NextVal())  
32 - role.Role.Device = in.Device  
33 - role.Role.Uid = uid  
34 - role.Create()  
35 - }  
36 - return &pb.RoleRsp{  
37 - Code: 0,  
38 - Role: role.Role,  
39 - }, nil  
40 -}  
41 -  
42 -func (s *GameServer) LoginHandler(ctx context.Context, in *pb.LoginReq) (*pb.RoleRsp, error) {  
43 - uid := ctx.Value("uid").(string)  
44 - ok, role := models.RoleExistByUid(uid)  
45 - if !ok {  
46 - return &pb.RoleRsp{  
47 - Code: 1,  
48 - }, nil  
49 - }  
50 - return &pb.RoleRsp{  
51 - Code: 0,  
52 - Role: role.Role,  
53 - Hero: models.GetHeros(role.Heros),  
54 - }, nil  
55 -}  
actions/basic.go deleted
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -package actions  
2 -  
3 -import (  
4 - "fmt"  
5 - "google.golang.org/grpc"  
6 - "net"  
7 - "pro2d/components/db"  
8 - "pro2d/components/etcd"  
9 - "pro2d/conf"  
10 - "pro2d/utils"  
11 -)  
12 -  
13 -type BasicServer struct {  
14 - SConf *conf.SConf  
15 - EtcdClient *etcd.EtcdClient  
16 - GrpcServer *grpc.Server  
17 -}  
18 -  
19 -func NewServer() *BasicServer {  
20 - return &BasicServer{}  
21 -}  
22 -  
23 -func (b *BasicServer) Start(sConf *conf.SConf) (net.Listener, error) {  
24 - b.SConf = sConf  
25 -  
26 - //初始化数据库  
27 - db.MongoDatabase = db.MongoClient.Database(sConf.DBName)  
28 - //初始化etcd  
29 - b.EtcdClient = etcd.NewEtcdClient(conf.GlobalConf.Etcd)  
30 - b.EtcdClient.PutWithLeasePrefix(sConf.Name, sConf.ID, fmt.Sprintf("%s:%d", sConf.IP, sConf.Port), 10)  
31 -  
32 - listing := fmt.Sprintf(":%d", sConf.Port)  
33 - lis, err := net.Listen("tcp", listing)  
34 - if err != nil {  
35 - return nil, err  
36 - }  
37 - return lis, err  
38 -}  
39 -  
40 -func (b *BasicServer) Stop() {  
41 - utils.Sugar.Debugf("平滑关闭服务")  
42 - b.EtcdClient.Close()  
43 - b.GrpcServer.GracefulStop()  
44 -}  
actions/server.go deleted
@@ -1,137 +0,0 @@ @@ -1,137 +0,0 @@
1 -package actions  
2 -  
3 -import (  
4 - "context"  
5 - "fmt"  
6 - "google.golang.org/grpc"  
7 - "google.golang.org/grpc/credentials"  
8 - "google.golang.org/grpc/reflection"  
9 - "pro2d/components/jwt"  
10 - "pro2d/conf"  
11 - "pro2d/models"  
12 - "pro2d/protos/pb"  
13 - "pro2d/utils"  
14 -)  
15 -  
16 -type LoginServer struct{  
17 - pb.UnsafeLoginServer  
18 - *BasicServer  
19 -}  
20 -  
21 -func NewAccountServer() *LoginServer {  
22 - return &LoginServer{  
23 - BasicServer: NewServer(),  
24 - }  
25 -}  
26 -  
27 -//拦截器  
28 -func AccountServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo,  
29 - handler grpc.UnaryHandler) (interface{}, error) {  
30 -  
31 - utils.Sugar.Debugf("gRPC method: %s, %v", info.FullMethod, req)  
32 - resp, err := handler(ctx, req)  
33 - return resp, err  
34 -}  
35 -  
36 -func (s *LoginServer)Start() error {  
37 - lis, err := s.BasicServer.Start(conf.GlobalConf.AccountConf)  
38 - if err != nil {  
39 - return err  
40 - }  
41 -  
42 - models.InitAccountServerModels()  
43 -  
44 - var opts []grpc.ServerOption  
45 -  
46 - if conf.GlobalConf.TLS.Status {  
47 - //TLS  
48 - creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key")  
49 - if err != nil {  
50 - utils.Sugar.Errorf("Failed to generate credentials %v", err)  
51 - return err  
52 - }  
53 - opts = append(opts, grpc.Creds(creds))  
54 - }  
55 -  
56 - //拦截器  
57 - opts = append(opts, grpc.UnaryInterceptor(AccountServerInterceptor))  
58 -  
59 - //new一个grpc  
60 - s.GrpcServer = grpc.NewServer(opts...)  
61 -  
62 - pb.RegisterLoginServer(s.GrpcServer, s)  
63 - reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务  
64 -  
65 - // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。  
66 - // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。  
67 - utils.Sugar.Debugf("Start LoginServer listening on %d with TLS", conf.GlobalConf.AccountConf.Port)  
68 -  
69 - return s.GrpcServer.Serve(lis)  
70 -}  
71 -  
72 -func (s *LoginServer)Stop() {  
73 - s.BasicServer.Stop()  
74 -}  
75 -  
76 -type GameServer struct{  
77 - pb.UnimplementedGameServer  
78 - *BasicServer  
79 -}  
80 -  
81 -func NewGameServer() *GameServer {  
82 - return &GameServer{  
83 - BasicServer: NewServer(),  
84 - }  
85 -}  
86 -//拦截器  
87 -func GameServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo,  
88 - handler grpc.UnaryHandler) (interface{}, error) {  
89 -  
90 - //utils.Sugar.Debugf("gRPC method: %s, %v", info.FullMethod, req)  
91 - uid := jwt.CheckAuth(ctx)  
92 - if uid == ""{  
93 - return nil, fmt.Errorf("token error")  
94 - }  
95 - context.WithValue(ctx, "uid", uid)  
96 - resp, err := handler(ctx, req)  
97 - return resp, err  
98 -}  
99 -  
100 -func (s *GameServer)Start() error {  
101 - lis, err := s.BasicServer.Start(conf.GlobalConf.GameConf)  
102 - if err != nil {  
103 - return err  
104 - }  
105 -  
106 - models.InitGameServerModels()  
107 -  
108 - var opts []grpc.ServerOption  
109 - //TLS  
110 - if conf.GlobalConf.TLS.Status {  
111 - //TLS  
112 - creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key")  
113 - if err != nil {  
114 - utils.Sugar.Errorf("Failed to generate credentials %v", err)  
115 - return err  
116 - }  
117 - opts = append(opts, grpc.Creds(creds))  
118 - }  
119 -  
120 - //拦截器  
121 - opts = append(opts, grpc.UnaryInterceptor(GameServerInterceptor))  
122 -  
123 - //new一个grpc  
124 - s.GrpcServer = grpc.NewServer(opts...)  
125 -  
126 - pb.RegisterGameServer(s.GrpcServer, s)  
127 - reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务  
128 -  
129 - // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。  
130 - // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。  
131 - utils.Sugar.Debugf("Start GameServer listening on %d with TLS", conf.GlobalConf.GameConf.Port)  
132 - return s.GrpcServer.Serve(lis)  
133 -}  
134 -  
135 -func (s *GameServer)Stop() {  
136 - s.BasicServer.Stop()  
137 -}  
138 \ No newline at end of file 0 \ No newline at end of file
cmd/game.go deleted
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 -package main  
2 -  
3 -import (  
4 - "os"  
5 - "os/signal"  
6 - "pro2d/actions"  
7 - "pro2d/utils"  
8 - "syscall"  
9 -)  
10 -  
11 -func main() {  
12 - err := make(chan error)  
13 - stopChan := make(chan os.Signal)  
14 - signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)  
15 -  
16 - server := actions.NewGameServer()  
17 - go func() {  
18 - err <- server.Start()  
19 - }()  
20 -  
21 -  
22 - select {  
23 - case e := <- err:  
24 - utils.Sugar.Errorf("game server error: %v", e)  
25 - case <-stopChan:  
26 - // 平滑关闭服务  
27 - server.Stop()  
28 - }  
29 -}  
cmd/account.go renamed to cmd/server.go
@@ -3,27 +3,26 @@ package main @@ -3,27 +3,26 @@ package main
3 import ( 3 import (
4 "os" 4 "os"
5 "os/signal" 5 "os/signal"
6 - "pro2d/actions" 6 + "pro2d/components/net"
  7 + "pro2d/conf"
7 "pro2d/utils" 8 "pro2d/utils"
8 "syscall" 9 "syscall"
9 ) 10 )
10 11
11 -func main() { 12 +func main() {
12 err := make(chan error) 13 err := make(chan error)
13 stopChan := make(chan os.Signal) 14 stopChan := make(chan os.Signal)
14 signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) 15 signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
15 16
16 - server := actions.NewAccountServer() 17 + s := net.NewServer(conf.GlobalConf.GameConf)
17 go func() { 18 go func() {
18 - err <- server.Start() 19 + err <- s.Start()
19 }() 20 }()
20 21
21 -  
22 select { 22 select {
23 case e := <- err: 23 case e := <- err:
24 utils.Sugar.Errorf("game server error: %v", e) 24 utils.Sugar.Errorf("game server error: %v", e)
25 case <-stopChan: 25 case <-stopChan:
26 - // 平滑关闭服务  
27 - server.Stop() 26 + s.Stop()
28 } 27 }
29 } 28 }
common/common.go 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +package common
  2 +
  3 +const (
  4 + HEADLEN = 8
  5 +)
components/net/conn.go 0 → 100644
@@ -0,0 +1,105 @@ @@ -0,0 +1,105 @@
  1 +package net
  2 +
  3 +import (
  4 + "bufio"
  5 + "fmt"
  6 + "net"
  7 +)
  8 +
  9 +type Head struct {
  10 + Length int32
  11 + Cmd int32
  12 + ErrCode int32
  13 + PreField int32
  14 +}
  15 +
  16 +
  17 +type Connection struct {
  18 + net.Conn
  19 + Id int
  20 + Server *Server
  21 +
  22 + scanner *bufio.Scanner
  23 + writer *bufio.Writer
  24 +
  25 + WBuffer chan []byte
  26 + RBuffer chan *MsgPkg
  27 +
  28 + Quit chan *Connection
  29 +}
  30 +
  31 +type MsgPkg struct {
  32 + Head Head
  33 + Body []byte
  34 + Conn *Connection
  35 +}
  36 +
  37 +func NewConn(id int, conn net.Conn, s *Server) *Connection {
  38 + return &Connection{
  39 + Id: id,
  40 + Conn: conn,
  41 + Server: s,
  42 +
  43 + scanner: bufio.NewScanner(conn),
  44 + writer: bufio.NewWriter(conn),
  45 + WBuffer: make(chan []byte),
  46 + RBuffer: make(chan *MsgPkg),
  47 + Quit: make(chan *Connection),
  48 + }
  49 +}
  50 +
  51 +func (c *Connection) write() {
  52 + defer c.Quiting()
  53 +
  54 + for msg := range c.WBuffer {
  55 + if _, err := c.writer.Write(msg); err != nil {
  56 + fmt.Println("write fail err: " + err.Error())
  57 + return
  58 + }
  59 + if err := c.writer.Flush(); err != nil {
  60 + fmt.Println("write Flush fail err: " + err.Error())
  61 + return
  62 + }
  63 + }
  64 +}
  65 +
  66 +func (c *Connection) read() {
  67 + defer c.Quiting()
  68 + for {
  69 + c.scanner.Split(ParseMsg)
  70 +
  71 + for c.scanner.Scan() {
  72 + req, err := DecodeMsg(c.scanner.Bytes())
  73 + if err != nil {
  74 + return
  75 + }
  76 +
  77 + req.Conn = c
  78 + c.Server.OnRecv(req)
  79 + }
  80 +
  81 + if err := c.scanner.Err(); err != nil {
  82 + fmt.Printf("scanner.err: %s\n", err.Error())
  83 + c.Quiting()
  84 + return
  85 + }
  86 + }
  87 +}
  88 +
  89 +func (c *Connection) Start() {
  90 + go c.write()
  91 + go c.read()
  92 +}
  93 +
  94 +func (c *Connection) Stop() {
  95 + close(c.RBuffer)
  96 + close(c.WBuffer)
  97 + c.Conn.Close()
  98 +}
  99 +
  100 +func (c *Connection) Quiting() {
  101 + c.Server.OnClose(c)
  102 +}
  103 +
  104 +func (c *Connection) SendMsg(){
  105 +}
0 \ No newline at end of file 106 \ No newline at end of file
components/net/msg.go 0 → 100644
@@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
  1 +package net
  2 +
  3 +import (
  4 + "bytes"
  5 + "encoding/binary"
  6 + "fmt"
  7 + "pro2d/common"
  8 +)
  9 +
  10 +func ParseMsg (data []byte, atEOF bool) (advance int, token []byte, err error) {
  11 + // 表示我们已经扫描到结尾了
  12 + if atEOF && len(data) == 0 {
  13 + return 0, nil, nil
  14 + }
  15 + if !atEOF && len(data) >= common.HEADLEN { //4字节数据包长度 4字节指令
  16 + length := int32(0)
  17 + binary.Read(bytes.NewReader(data[0:4]), binary.BigEndian, &length)
  18 + if length <= 0 {
  19 + return 0, nil, fmt.Errorf("length is 0")
  20 + }
  21 + if int(length) <= len(data) {
  22 + return int(length) , data[:int(length)], nil
  23 + }
  24 + return 0 , nil, nil
  25 + }
  26 + if atEOF {
  27 + return len(data), data, nil
  28 + }
  29 + return 0, nil, nil
  30 +}
  31 +
  32 +
  33 +func DecodeMsg(data []byte) (*MsgPkg, error) {
  34 + h := Head{}
  35 + err := binary.Read(bytes.NewReader(data), binary.BigEndian, &h)
  36 + if err != nil {
  37 + return nil, err
  38 + }
  39 + return &MsgPkg{
  40 + Head: h,
  41 + Body: data[common.HEADLEN:],
  42 + },nil
  43 +}
components/net/server.go 0 → 100644
@@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
  1 +package net
  2 +
  3 +import (
  4 + "fmt"
  5 + "net"
  6 + "pro2d/conf"
  7 + "pro2d/utils"
  8 + "sync"
  9 +)
  10 +
  11 +type Server struct {
  12 + SConf *conf.SConf
  13 + Clients *sync.Map
  14 +
  15 +}
  16 +
  17 +func NewServer(sConf *conf.SConf) *Server {
  18 + return &Server{
  19 + SConf: sConf,
  20 + Clients: new(sync.Map),
  21 + }
  22 +}
  23 +
  24 +func (s *Server) OnRecv(msg *MsgPkg) {
  25 + utils.Sugar.Debugf("cmd: %d, data: %s", msg.Head.Cmd, msg.Body)
  26 +}
  27 +
  28 +func (s *Server) OnClose(conn *Connection) {
  29 + s.Clients.Delete(conn.Id)
  30 +}
  31 +
  32 +func (s *Server)Start() error {
  33 + port := fmt.Sprintf(":%d", s.SConf.Port)
  34 + l, err := net.Listen("tcp", port)
  35 + if err != nil {
  36 + return err
  37 + }
  38 +
  39 + utils.Sugar.Debugf("listen on %s\n", port)
  40 + id := 0
  41 + for {
  42 + conn, err := l.Accept()
  43 + if err != nil {
  44 + return err
  45 + }
  46 +
  47 + id++
  48 + client := NewConn(id, conn, s)
  49 + s.Clients.Store(id, client)
  50 + go client.Start()
  51 + }
  52 +}
  53 +
  54 +func (s *Server)Stop() {
  55 +}
  56 +
doc/proto.md 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +
  2 +## 包
  3 +包 = 包头 + 包体
  4 +
  5 +## 包头
  6 +| |类型|长度| 描述|
  7 +|---|---|---|---|
  8 +|包长度|int32|4字节| 包头(16字节) + 包体长度|
  9 +|协议号|int32|4字节| |
  10 +|错误码|int32|4字节||
  11 +|预留字段|int32|4字节||
  12 +
  13 +## 包体
0 \ No newline at end of file 14 \ No newline at end of file
1 -//参考:https://jergoo.gitbooks.io/go-grpc-practice-guide/content/chapter2/interceptor.html  
2 -  
3 package main 1 package main
4 2
5 import ( 3 import (
6 - "context"  
7 - "fmt"  
8 - "google.golang.org/grpc"  
9 - "google.golang.org/grpc/credentials"  
10 - "pro2d/components/jwt"  
11 - _ "pro2d/conf"  
12 - "pro2d/protos/pb" 4 + "bytes"
  5 + "encoding/binary"
  6 + "net"
  7 + net2 "pro2d/components/net"
13 "pro2d/utils" 8 "pro2d/utils"
14 ) 9 )
15 10
16 -func Register(c pb.LoginClient, phone, password string) error {  
17 - r, err := c.RegisterHandler(context.Background(), &pb.Register{  
18 - Phone: "17683852936",  
19 - Password: "123456",  
20 - Code: 0,  
21 - }) 11 +func main() {
22 12
23 - if err != nil {  
24 - return err  
25 - }  
26 - if r.Code != 0 {  
27 - return fmt.Errorf("register fail") 13 + head := net2.Head{
  14 + Length: 0,
  15 + Cmd: 1,
  16 + ErrCode: 0,
  17 + PreField: 0,
28 } 18 }
29 - utils.Sugar.Debug("register success")  
30 - return nil  
31 -}  
32 19
33 -func Login(loginUri, token, uid string) {  
34 - var opts []grpc.DialOption  
35 - // 指定自定义认证  
36 - opts = append(opts, grpc.WithPerRPCCredentials(&jwt.AuthToken{Token: token}))  
37 - if TLS {  
38 - // TLS连接  
39 - creds, err := credentials.NewClientTLSFromFile("keys/server.pem", ServerName)  
40 - if err != nil {  
41 - utils.Sugar.Fatalf("Failed to create TLS credentials %v", err)  
42 - return  
43 - }  
44 - opts = append(opts, grpc.WithTransportCredentials(creds))  
45 20
46 - }else{  
47 - opts = append(opts, grpc.WithInsecure()) 21 + b := net2.MsgPkg{
  22 + Head: head,
  23 + Body: []byte("hello world"),
48 } 24 }
49 -  
50 - gameConn, err := grpc.Dial(loginUri, opts...) 25 + head.Length = int32(16 + len(b.Body))
  26 + buf := &bytes.Buffer{}
  27 + err := binary.Write(buf, binary.BigEndian, head)
51 if err != nil { 28 if err != nil {
52 - utils.Sugar.Errorf("game conn err: %v", err) 29 + utils.Sugar.Errorf("err: %v, head: %v", err, head)
53 return 30 return
54 } 31 }
55 - defer gameConn.Close()  
56 -  
57 - client:= pb.NewGameClient(gameConn)  
58 - var role *pb.Role  
59 - loginRsp, err := client.LoginHandler(context.Background(), &pb.LoginReq{  
60 - Device: "111111",  
61 - }) 32 + utils.Sugar.Debugf("head: %v", head)
62 33
  34 + err = binary.Write(buf, binary.BigEndian, b.Body)
63 if err != nil { 35 if err != nil {
64 - utils.Sugar.Errorf("login error: %v", err) 36 + utils.Sugar.Errorf("err: %v, msg: %v", err, b.Body)
65 return 37 return
66 } 38 }
67 - role = loginRsp.Role  
68 -  
69 - if loginRsp.Code != 0 {  
70 - utils.Sugar.Debugf("login fail, role not exist")  
71 - createRole, err := client.CreateRoleHandler(context.Background(), &pb.LoginReq{Device: "11111"})  
72 - if err != nil {  
73 - utils.Sugar.Errorf("create role err: %v", err)  
74 - return  
75 - }  
76 - utils.Sugar.Debug("create role rsp: ", createRole.Code)  
77 - role = createRole.Role  
78 - }  
79 -  
80 - utils.Sugar.Debugf("login successful role: %v", role)  
81 -}  
82 -  
83 -const (  
84 - TLS = true  
85 - ServerName = "pro2d"  
86 -)  
87 -  
88 -func main() {  
89 -  
90 - var opts []grpc.DialOption  
91 - if TLS {  
92 - // TLS连接  
93 - creds, err := credentials.NewClientTLSFromFile("keys/server.pem", ServerName)  
94 - if err != nil {  
95 - utils.Sugar.Fatalf("Failed to create TLS credentials %v", err)  
96 - return  
97 - }  
98 - opts = append(opts, grpc.WithTransportCredentials(creds))  
99 -  
100 - }else{  
101 - opts = append(opts, grpc.WithInsecure())  
102 - }  
103 -  
104 - conn, err := grpc.Dial("localhost:8848", opts...)  
105 - if err != nil {  
106 - utils.Sugar.Errorf("conn err: %v", err)  
107 - return  
108 - }  
109 - defer conn.Close()  
110 - c := pb.NewLoginClient(conn)  
111 - //err = Register(c,"17683852936", "123456")  
112 - //if err != nil {  
113 - // utils.Sugar.Errorf("register err: %v", err)  
114 - // return  
115 - //}  
116 - rsp, err := c.CreateTokenHandler(context.Background(), &pb.Account{  
117 - Phone: "17683852936",  
118 - Password: "123456",  
119 - })  
120 39
  40 + client, err := net.Dial("tcp", "localhost:8849")
121 if err != nil { 41 if err != nil {
122 - utils.Sugar.Errorf("createtoken err: %v", err)  
123 - return  
124 - }  
125 -  
126 - if rsp.Code != 0 {  
127 - utils.Sugar.Errorf("createtoken err" ) 42 + utils.Sugar.Error(err)
128 return 43 return
129 } 44 }
130 -  
131 - if len(rsp.GameService) >0 {  
132 - Login(rsp.GameService[0].Address, rsp.Token, rsp.Uid)  
133 - } 45 + client.Write(buf.Bytes())
  46 + select {}
134 } 47 }
135 \ No newline at end of file 48 \ No newline at end of file
test/tlsclient.go deleted
@@ -1,64 +0,0 @@ @@ -1,64 +0,0 @@
1 -package main  
2 -  
3 -import (  
4 - "context"  
5 - "google.golang.org/grpc"  
6 - "google.golang.org/grpc/credentials"  
7 - "google.golang.org/protobuf/types/known/emptypb"  
8 - "log"  
9 - "pro2d/components/jwt"  
10 - _ "pro2d/conf"  
11 - "pro2d/protos/pb"  
12 - "pro2d/utils"  
13 -)  
14 -// AuthToken 自定义认证 客户端使用  
15 -type CustomToken struct {  
16 -}  
17 -  
18 -func (c CustomToken) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {  
19 - return map[string]string{  
20 - "appId": "100",  
21 - "appKey": "token",  
22 - }, nil  
23 -}  
24 -  
25 -func (c CustomToken) RequireTransportSecurity() bool {  
26 - return true  
27 -}  
28 -  
29 -func main() {  
30 - var opts []grpc.DialOption  
31 - creds, err := credentials.NewClientTLSFromFile("keys/server.pem", "pro2d")  
32 - if err != nil {  
33 - log.Fatal(err)  
34 - return  
35 - }  
36 - opts = append(opts, grpc.WithTransportCredentials(creds))  
37 - conn, err := grpc.Dial("localhost:8948", opts...)  
38 -  
39 - helloClient := pb.NewHelloClient(conn)  
40 - token, err := helloClient.CreateToken(context.TODO(), &pb.Login{  
41 - Login: "login",  
42 - Password: "123456",  
43 - })  
44 - if err != nil {  
45 - log.Fatal(err)  
46 - return  
47 - }  
48 - utils.Sugar.Debugf("token: %s", token.Token)  
49 -  
50 - opts = append(opts, grpc.WithPerRPCCredentials(&jwt.AuthToken{Token: token.Token}))  
51 - conn2, err := grpc.Dial("localhost:8948",opts...)  
52 - if err != nil {  
53 - log.Fatal(err)  
54 - return  
55 - }  
56 -  
57 - helloClient2 := pb.NewHelloClient(conn2)  
58 - rsp, err := helloClient2.SayHello(context.TODO(), &emptypb.Empty{})  
59 - if err != nil {  
60 - log.Fatal(err)  
61 - }  
62 -  
63 - log.Printf("sayhello rsp: %v", rsp)  
64 -}  
test/tlsserver.go deleted
@@ -1,90 +0,0 @@ @@ -1,90 +0,0 @@
1 -package main  
2 -  
3 -import (  
4 - "context"  
5 - "fmt"  
6 - "google.golang.org/grpc"  
7 - "google.golang.org/grpc/codes"  
8 - "google.golang.org/grpc/credentials"  
9 - "google.golang.org/grpc/metadata"  
10 - "google.golang.org/grpc/status"  
11 - "google.golang.org/protobuf/types/known/emptypb"  
12 - "log"  
13 - "net"  
14 - "pro2d/components/jwt"  
15 - "pro2d/protos/pb"  
16 -)  
17 -  
18 -type Server struct {  
19 - pb.UnimplementedHelloServer  
20 -}  
21 -  
22 -func (s *Server) CreateToken(ctx context.Context, in *pb.Login) (*pb.TokenInfo, error) {  
23 - if in.Login == "login" && in.Password == "123456" {  
24 - return &pb.TokenInfo{Token: jwt.CreateToken(in.Login)}, nil  
25 - }  
26 - return nil, fmt.Errorf("login error")  
27 -}  
28 -  
29 -//func (s *Server) SayHello(ctx context.Context, empty *emptypb.Empty) (*pb.HelloWorld, error) {  
30 -// md, ok := metadata.FromIncomingContext(ctx)  
31 -// if !ok {  
32 -// return nil, status.Errorf(codes.Unauthenticated,"ErrNoMetadataInContext")  
33 -// }  
34 -// // md 的类型是 type MD map[string][]string  
35 -// token, ok := md["authorization"]  
36 -// if !ok || len(token) == 0 {  
37 -// return nil, status.Errorf(codes.Unauthenticated,"ErrNoAuthorizationInMetadata")  
38 -// }  
39 -// login := jwt.ParseToken(token[0])  
40 -// return &pb.HelloWorld{Msg: "Hello world: " + login}, nil  
41 -//}  
42 -  
43 -func (s *Server) SayHello(ctx context.Context, empty *emptypb.Empty) (*pb.HelloWorld, error) {  
44 - md, ok := metadata.FromIncomingContext(ctx)  
45 - if !ok {  
46 - return nil, status.Errorf(codes.Unauthenticated, "无Token认证信息")  
47 - }  
48 - var (  
49 - appId string  
50 - appKey string  
51 - )  
52 - if val, ok := md["appid"]; ok {  
53 - appId = val[0]  
54 - }  
55 -  
56 - if val, ok := md["appkey"]; ok {  
57 - appKey = val[0]  
58 - }  
59 -  
60 - if appId != "100" || appKey != "token" {  
61 - return nil, status.Errorf(codes.Unauthenticated, "Token认证信息无效: appid=%s, appkey=%s", appId, appKey)  
62 - }  
63 -  
64 - return &pb.HelloWorld{Msg: "Hello world"}, nil  
65 -}  
66 -func main() {  
67 - // 监听本地端口  
68 - listener, err := net.Listen("tcp", ":8948")  
69 - if err != nil {  
70 - log.Fatalf("net.Listen err: %v", err)  
71 - }  
72 - var opts []grpc.ServerOption  
73 - // 从输入证书文件和密钥文件为服务端构造TLS凭证  
74 - creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key")  
75 - if err != nil {  
76 - log.Fatalf("Failed to generate credentials %v", err)  
77 - }  
78 - opts = append(opts, grpc.Creds(creds))  
79 - // 新建gRPC服务器实例,并开启TLS认证  
80 - grpcServer := grpc.NewServer(opts...)  
81 -  
82 - // 在gRPC服务器注册我们的服务  
83 - pb.RegisterHelloServer(grpcServer, &Server{})  
84 - log.Println(" net.Listing whth TLS")  
85 - //用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用  
86 - err = grpcServer.Serve(listener)  
87 - if err != nil {  
88 - log.Fatalf("grpcServer.Serve err: %v", err)  
89 - }  
90 -}  
91 \ No newline at end of file 0 \ No newline at end of file
tools/csvtostruct.go
@@ -154,7 +154,7 @@ func (g *Generate)CsvToMem(csvpath, filename string) error { @@ -154,7 +154,7 @@ func (g *Generate)CsvToMem(csvpath, filename string) error {
154 //4行之后 154 //4行之后
155 fields := sheetData[1] 155 fields := sheetData[1]
156 typs := sheetData[2] //int, string 156 typs := sheetData[2] //int, string
157 - //keys := sheetData[3] //all, s, c 157 + keys := sheetData[3] //all, key, key1, key2
158 158
159 t := reflect.ValueOf(csvdata.CsvStruct[name]).Type() 159 t := reflect.ValueOf(csvdata.CsvStruct[name]).Type()
160 v := reflect.New(t).Elem() 160 v := reflect.New(t).Elem()
@@ -175,9 +175,19 @@ func (g *Generate)CsvToMem(csvpath, filename string) error { @@ -175,9 +175,19 @@ func (g *Generate)CsvToMem(csvpath, filename string) error {
175 f.SetString(record[idx]) 175 f.SetString(record[idx])
176 } 176 }
177 177
  178 + switch keys[idx] {
  179 + case "all":
  180 + case "key":
  181 + case "key1":
  182 +
  183 + case "key2":
  184 + default:
  185 +
  186 + }
  187 +
178 //fmt.Printf("%d, %s: %v, %v\n", idx, firstRuneToUpper(field), v.Field(idx), v.Interface()) 188 //fmt.Printf("%d, %s: %v, %v\n", idx, firstRuneToUpper(field), v.Field(idx), v.Interface())
179 - csvdata.SetCsv(name, v.Interface())  
180 } 189 }
  190 + csvdata.SetCsv(name, datam)
181 } 191 }
182 i++ 192 i++
183 } 193 }