Commit 5d9cf01cbdc139472b319451621762875f5a3bbf
1 parent
cad2b7f3
plugin 热更
Showing
19 changed files
with
219 additions
and
98 deletions
Show diff stats
Makefile
1 | -all: gen build | |
1 | +all: gen game | |
2 | +IMGTIME := $(shell date "+%G%m%d_%H%M%S") | |
3 | +pname = plugin-$(IMGTIME).so | |
2 | 4 | |
3 | 5 | gen: |
4 | 6 | protoc -I./protos --go_out=./protos --go-grpc_out=./protos ./protos/*proto |
... | ... | @@ -8,11 +10,16 @@ test: |
8 | 10 | go run test/client.go |
9 | 11 | http: |
10 | 12 | go run cmd/http.go |
11 | -game: | |
13 | + | |
14 | +game:plugin | |
12 | 15 | go run cmd/game.go |
13 | 16 | build: |
14 | 17 | go build -o bin/account cmd/http.go |
15 | 18 | go build -o bin/game cmd/game.go |
16 | 19 | go build -o bin/test test/client.go |
20 | +plugin: | |
21 | + #go build -ldflags -pluginpath="plugin/hot-1" --buildmode=plugin -o bin/plugin.so src/plugin/*.go | |
22 | + go build --buildmode=plugin -o bin/$(pname) src/plugin/*.go | |
23 | + cd bin && rm -rf plugin.so && ln -s $(pname) plugin.so && cd - | |
17 | 24 | |
18 | -.PHONY: all build protos test cert | |
19 | 25 | \ No newline at end of file |
26 | +.PHONY: all build protos test cert plugin | |
20 | 27 | \ No newline at end of file | ... | ... |
cmd/game.go
... | ... | @@ -14,16 +14,26 @@ func main() { |
14 | 14 | stopChan := make(chan os.Signal) |
15 | 15 | signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) |
16 | 16 | |
17 | + userChan := make(chan os.Signal) | |
18 | + signal.Notify(userChan, syscall.SIGUSR1, syscall.SIGUSR2) | |
19 | + | |
17 | 20 | s := net.NewServer(conf.GlobalConf.GameConf) |
18 | 21 | go func() { |
19 | 22 | err <- s.Start() |
20 | 23 | }() |
21 | 24 | |
22 | - select { | |
23 | - case e := <- err: | |
24 | - logger.Error("game server error: %v", e) | |
25 | - case <-stopChan: | |
26 | - s.Stop() | |
27 | - logger.Debug("game stop...") | |
25 | + for { | |
26 | + select { | |
27 | + case e := <- err: | |
28 | + logger.Error("game server error: %v", e) | |
29 | + return | |
30 | + case <-stopChan: | |
31 | + s.Stop() | |
32 | + logger.Debug("game stop...") | |
33 | + return | |
34 | + case u := <-userChan: | |
35 | + logger.Debug("userChan .. %v",u.String()) | |
36 | + s.LoadPlugin() | |
37 | + } | |
28 | 38 | } |
29 | 39 | } | ... | ... |
conf/conf.go
... | ... | @@ -31,18 +31,14 @@ type MongoConf struct { |
31 | 31 | MaxNum int `yaml:"maxnum"` |
32 | 32 | } |
33 | 33 | |
34 | -type TLS struct { | |
35 | - Status bool `yaml:"status"` | |
36 | - Key string `yaml:"key"` | |
37 | - Pem string `yaml:"pem"` | |
38 | -} | |
39 | - | |
40 | 34 | type SConf struct { |
41 | 35 | ID string `yaml:"id"` |
42 | 36 | Name string `yaml:"name"` |
43 | 37 | IP string `yaml:"ip"` |
44 | 38 | Port int `yaml:"port"` |
45 | 39 | DBName string `yaml:"dbname"` |
40 | + WorkerPoolSize int `yaml:"pool_size"` | |
41 | + PluginPath string `yaml:"plugin_path"` | |
46 | 42 | } |
47 | 43 | |
48 | 44 | type LogConsole struct { |
... | ... | @@ -81,7 +77,6 @@ type ServerConf struct { |
81 | 77 | WorkerID int64 `yaml:"workerid"` |
82 | 78 | DatacenterID int64 `yaml:"datacenterid"` |
83 | 79 | MongoConf *MongoConf `yaml:"mongo"` |
84 | - TLS *TLS `yaml:"tls"` | |
85 | 80 | AccountConf *SConf `yaml:"server_account"` |
86 | 81 | GameConf *SConf `yaml:"server_game"` |
87 | 82 | RedisConf *RedisConf `yaml:"redis"` | ... | ... |
conf/conf.yaml
... | ... | @@ -22,6 +22,7 @@ server_account: |
22 | 22 | ip: "192.168.0.206" |
23 | 23 | port: 8848 |
24 | 24 | dbname: "account" |
25 | + pool_size: 1 | |
25 | 26 | |
26 | 27 | server_game: |
27 | 28 | id: "1" |
... | ... | @@ -29,6 +30,8 @@ server_game: |
29 | 30 | ip: "192.168.0.206" |
30 | 31 | port: 8849 |
31 | 32 | dbname: "game" |
33 | + pool_size: 1 | |
34 | + plugin_path: "./bin/plugin.so" | |
32 | 35 | |
33 | 36 | logconf: |
34 | 37 | TimeFormat: "2006-01-02 15:04:05" | ... | ... |
... | ... | @@ -0,0 +1,32 @@ |
1 | +package main | |
2 | + | |
3 | +import ( | |
4 | + "fmt" | |
5 | + "os" | |
6 | + "plugin" | |
7 | + "pro2d/src/components/net" | |
8 | +) | |
9 | + | |
10 | +func main() { | |
11 | + p, err := plugin.Open("./bin/plugin.so") | |
12 | + if err != nil { | |
13 | + fmt.Println("error open plugin: ", err) | |
14 | + os.Exit(-1) | |
15 | + } | |
16 | + s, err := p.Lookup("IamPluginA") | |
17 | + if err != nil { | |
18 | + fmt.Println("error lookup IamPluginA: ", err) | |
19 | + os.Exit(-1) | |
20 | + } | |
21 | + pkg1 := net.MsgPkg{ | |
22 | + Head: &net.Head{ | |
23 | + Length: 16, | |
24 | + Cmd: 0, | |
25 | + ErrCode: 0, | |
26 | + }, | |
27 | + } | |
28 | + if x, ok := s.(func(net.MsgPkg)); ok { | |
29 | + x(pkg1) | |
30 | + } | |
31 | + | |
32 | +} | ... | ... |
src/common/common.go
src/components/db/redis.go
... | ... | @@ -2,12 +2,12 @@ package db |
2 | 2 | |
3 | 3 | import ( |
4 | 4 | "github.com/garyburd/redigo/redis" |
5 | - "pro2d/conf" | |
6 | 5 | "time" |
7 | 6 | ) |
8 | 7 | var RedisPool *redis.Pool |
9 | 8 | |
10 | -func ConnectRedis(conf *conf.ServerConf) error { | |
9 | +//conf *conf.ServerConf | |
10 | +func ConnectRedis(db int, auth, address string) error { | |
11 | 11 | RedisPool = &redis.Pool{ |
12 | 12 | //最大活跃连接数,0代表无限 |
13 | 13 | MaxActive: 888, |
... | ... | @@ -16,11 +16,11 @@ func ConnectRedis(conf *conf.ServerConf) error { |
16 | 16 | IdleTimeout: time.Second * 100, |
17 | 17 | //定义拨号获得连接的函数 |
18 | 18 | Dial: func() (redis.Conn, error) { |
19 | - option := []redis.DialOption{redis.DialDatabase(conf.RedisConf.DB)} | |
20 | - if conf.RedisConf.Auth != "" { | |
21 | - option = append(option, redis.DialPassword(conf.RedisConf.Auth)) | |
19 | + option := []redis.DialOption{redis.DialDatabase(db)} | |
20 | + if auth != "" { | |
21 | + option = append(option, redis.DialPassword(auth)) | |
22 | 22 | } |
23 | - return redis.Dial("tcp",conf.RedisConf.Address, option...) | |
23 | + return redis.Dial("tcp",address, option...) | |
24 | 24 | }, |
25 | 25 | } |
26 | 26 | return nil | ... | ... |
src/components/jwt/jwt.go
... | ... | @@ -3,9 +3,8 @@ package jwt |
3 | 3 | import ( |
4 | 4 | "context" |
5 | 5 | "fmt" |
6 | - "pro2d/conf" | |
7 | 6 | "pro2d/src/common" |
8 | - "pro2d/src/utils" | |
7 | + "pro2d/src/components/logger" | |
9 | 8 | "time" |
10 | 9 | |
11 | 10 | jwt "github.com/dgrijalva/jwt-go" |
... | ... | @@ -33,18 +32,18 @@ func ParseToken(tokenStr string) string { |
33 | 32 | token, err := jwt.ParseWithClaims(tokenStr, &clientClaims, func(token *jwt.Token) (interface{}, error) { |
34 | 33 | if token.Header["alg"] != "HS256" { |
35 | 34 | //panic("ErrInvalidAlgorithm") |
36 | - utils.Sugar.Error("ErrInvalidAlgorithm") | |
35 | + logger.Error("ErrInvalidAlgorithm") | |
37 | 36 | return nil, nil |
38 | 37 | } |
39 | 38 | return []byte(common.Pro2DTokenSignedString), nil |
40 | 39 | }) |
41 | 40 | if err != nil { |
42 | - utils.Sugar.Error("jwt parse error") | |
41 | + logger.Error("jwt parse error") | |
43 | 42 | return "" |
44 | 43 | } |
45 | 44 | |
46 | 45 | if !token.Valid { |
47 | - utils.Sugar.Error("ErrInvalidToken") | |
46 | + logger.Error("ErrInvalidToken") | |
48 | 47 | return "" |
49 | 48 | } |
50 | 49 | return clientClaims.Uid |
... | ... | @@ -75,7 +74,7 @@ func getTokenFromContext(ctx context.Context) (string, error) { |
75 | 74 | func CheckAuth(ctx context.Context) string { |
76 | 75 | tokenStr, err := getTokenFromContext(ctx) |
77 | 76 | if err != nil { |
78 | - utils.Sugar.Errorf("get token from context error") | |
77 | + logger.Error("get token from context error") | |
79 | 78 | return "" |
80 | 79 | } |
81 | 80 | return ParseToken(tokenStr) |
... | ... | @@ -93,5 +92,5 @@ func (c AuthToken) GetRequestMetadata(ctx context.Context, uri ...string) (map[s |
93 | 92 | } |
94 | 93 | |
95 | 94 | func (c AuthToken) RequireTransportSecurity() bool { |
96 | - return conf.GlobalConf.TLS.Status | |
95 | + return false | |
97 | 96 | } |
98 | 97 | \ No newline at end of file | ... | ... |
src/components/net/conn.go
... | ... | @@ -67,24 +67,28 @@ func (c *Connection) write() { |
67 | 67 | |
68 | 68 | func (c *Connection) read() { |
69 | 69 | defer c.Quiting() |
70 | - for { | |
71 | - c.scanner.Split(ParseMsg) | |
70 | + c.scanner.Split(ParseMsg) | |
72 | 71 | |
73 | - for c.scanner.Scan() { | |
74 | - req, err := DecodeMsg(c.scanner.Bytes()) | |
75 | - if err != nil { | |
76 | - return | |
77 | - } | |
78 | - | |
79 | - req.Conn = c | |
80 | - c.Server.OnRecv(req) | |
81 | - } | |
82 | - | |
83 | - if err := c.scanner.Err(); err != nil { | |
84 | - fmt.Printf("scanner.err: %s\n", err.Error()) | |
85 | - c.Quiting() | |
72 | + for c.scanner.Scan() { | |
73 | + req, err := DecodeMsg(c.scanner.Bytes()) | |
74 | + if err != nil { | |
86 | 75 | return |
87 | 76 | } |
77 | + | |
78 | + req.Conn = c | |
79 | + //得到需要处理此条连接的workerID | |
80 | + workerID := c.Id % c.Server.SConf.WorkerPoolSize | |
81 | + //将请求消息发送给任务队列 | |
82 | + c.Server.TaskQueue[workerID] <- req | |
83 | + | |
84 | + //备注,可以在当前协程处理当条请求(如下, 实现很简单,已经删除),也可以丢到协程池里处理任务(如上),还未对比效果。 | |
85 | + //c.Server.OnRecv(req) | |
86 | + } | |
87 | + | |
88 | + if err := c.scanner.Err(); err != nil { | |
89 | + fmt.Printf("scanner.err: %s\n", err.Error()) | |
90 | + c.Quiting() | |
91 | + return | |
88 | 92 | } |
89 | 93 | } |
90 | 94 | ... | ... |
src/components/net/server.go
... | ... | @@ -4,8 +4,10 @@ import ( |
4 | 4 | "fmt" |
5 | 5 | "github.com/golang/protobuf/proto" |
6 | 6 | "net" |
7 | + "plugin" | |
7 | 8 | "pro2d/conf" |
8 | 9 | "pro2d/protos/pb" |
10 | + "pro2d/src/common" | |
9 | 11 | "pro2d/src/components/db" |
10 | 12 | "pro2d/src/components/etcd" |
11 | 13 | "pro2d/src/components/logger" |
... | ... | @@ -21,18 +23,48 @@ type Server struct { |
21 | 23 | Clients *sync.Map |
22 | 24 | EtcdClient *etcd.EtcdClient |
23 | 25 | |
26 | + TaskQueue []chan*MsgPkg | |
24 | 27 | } |
25 | 28 | |
26 | 29 | func NewServer(sConf *conf.SConf) *Server { |
27 | 30 | return &Server{ |
28 | 31 | SConf: sConf, |
29 | 32 | Clients: new(sync.Map), |
33 | + EtcdClient: new(etcd.EtcdClient), | |
34 | + | |
35 | + TaskQueue: make([]chan *MsgPkg, common.WorkerPoolSize), | |
36 | + } | |
37 | +} | |
38 | + | |
39 | +//StartWorkerPool 启动worker工作池 | |
40 | +func (s *Server) StartWorkerPool() { | |
41 | + //遍历需要启动worker的数量,依此启动 | |
42 | + for i := 0; i < s.SConf.WorkerPoolSize; i++ { | |
43 | + //一个worker被启动 | |
44 | + //给当前worker对应的任务队列开辟空间 | |
45 | + s.TaskQueue[i] = make(chan *MsgPkg, common.MaxTaskPerWorker) | |
46 | + //启动当前Worker,阻塞的等待对应的任务队列是否有消息传递进来 | |
47 | + go s.StartOneWorker(i, s.TaskQueue[i]) | |
48 | + } | |
49 | +} | |
50 | + | |
51 | +//StartOneWorker 启动一个Worker工作流程 | |
52 | +func (s *Server) StartOneWorker(workerID int, taskQueue chan *MsgPkg) { | |
53 | + //不断的等待队列中的消息 | |
54 | + for { | |
55 | + select { | |
56 | + //有消息则取出队列的Request,并执行绑定的业务方法 | |
57 | + case request := <-taskQueue: | |
58 | + _ = workerID | |
59 | + s.DoMsgHandler(request) | |
60 | + } | |
30 | 61 | } |
31 | 62 | } |
32 | 63 | |
33 | -func (s *Server) OnRecv(msg *MsgPkg) { | |
34 | - logger.Debug("cmd: %d, data: %s", msg.Head.Cmd, msg.Body) | |
64 | +func (s *Server) DoMsgHandler(msg *MsgPkg) { | |
65 | + logger.Debug("DoMsgHandler cmd: %d, data: %s", msg.Head.Cmd, msg.Body) | |
35 | 66 | if md, ok := ActionMap[pb.ProtoCode(msg.Head.Cmd)]; ok { |
67 | + logger.Debug("adfadfadfasdfadfadsf") | |
36 | 68 | errCode, protomsg := md(msg) |
37 | 69 | rsp, err := proto.Marshal(protomsg) |
38 | 70 | if err != nil { |
... | ... | @@ -49,21 +81,47 @@ func (s *Server) OnClose(conn *Connection) { |
49 | 81 | s.Clients.Delete(conn.Id) |
50 | 82 | } |
51 | 83 | |
84 | +func (s *Server) LoadPlugin() { | |
85 | + //重新加载 | |
86 | + p, err:=plugin.Open(conf.GlobalConf.GameConf.PluginPath) | |
87 | + if err != nil { | |
88 | + logger.Error("load plugin err: %v", err) | |
89 | + return | |
90 | + } | |
91 | + symboll, err := p.Lookup("LoadRpc") | |
92 | + if err != nil { | |
93 | + logger.Error("plugin symbol err: %v", err) | |
94 | + return | |
95 | + } | |
96 | + if x, ok := symboll.(func()); ok { | |
97 | + x() | |
98 | + logger.Debug("load plugin success") | |
99 | + } | |
100 | +} | |
101 | + | |
52 | 102 | func (s *Server)Start() error { |
53 | 103 | //mongo 初始化 |
54 | - db.MongoDatabase = db.MongoClient.Database(conf.GlobalConf.AccountConf.DBName) | |
104 | + db.MongoDatabase = db.MongoClient.Database(conf.GlobalConf.GameConf.DBName) | |
55 | 105 | models.InitGameServerModels() |
56 | 106 | |
57 | 107 | //Etcd 初始化 |
58 | 108 | s.EtcdClient = etcd.NewEtcdClient(conf.GlobalConf.Etcd) |
59 | 109 | s.EtcdClient.PutWithLeasePrefix(conf.GlobalConf.GameConf.Name, conf.GlobalConf.GameConf.ID, fmt.Sprintf("%s:%d", conf.GlobalConf.GameConf.IP, conf.GlobalConf.GameConf.Port), 5) |
60 | 110 | |
111 | + //初始化plugin | |
112 | + _, err := plugin.Open(conf.GlobalConf.GameConf.PluginPath) | |
113 | + if err != nil { | |
114 | + return err | |
115 | + } | |
116 | + | |
61 | 117 | port := fmt.Sprintf(":%d", s.SConf.Port) |
62 | 118 | l, err := net.Listen("tcp", port) |
63 | 119 | if err != nil { |
64 | 120 | return err |
65 | 121 | } |
66 | 122 | |
123 | + s.StartWorkerPool() | |
124 | + | |
67 | 125 | logger.Debug("listen on %s\n", port) |
68 | 126 | id := 0 |
69 | 127 | for { | ... | ... |
src/actions/RoleAction.go renamed to src/plugin/RolePlugin.go
1 | -package actions | |
1 | +package main | |
2 | 2 | |
3 | 3 | import ( |
4 | 4 | "github.com/golang/protobuf/proto" |
... | ... | @@ -34,6 +34,7 @@ func CreateRpc(msg *net.MsgPkg) (int32, proto.Message) { |
34 | 34 | } |
35 | 35 | |
36 | 36 | func LoginRpc(msg *net.MsgPkg) (int32, proto.Message) { |
37 | + logger.Debug("cmd: %v, msg: %s", msg.Head.Cmd, msg.Body) | |
37 | 38 | req := pb.LoginReq{} |
38 | 39 | if err := proto.Unmarshal(msg.Body, &req); err != nil { |
39 | 40 | logger.Error("loginRpc err: %v", err) | ... | ... |
src/actions/protocode.go renamed to src/plugin/protocode.go
1 | -package actions | |
1 | +package main | |
2 | 2 | |
3 | 3 | import ( |
4 | 4 | "pro2d/protos/pb" |
5 | + "pro2d/src/components/logger" | |
5 | 6 | "pro2d/src/components/net" |
6 | 7 | ) |
7 | 8 | |
8 | -func init() { | |
9 | +func LoadRpc() { | |
10 | + logger.Debug("init protocode...") | |
9 | 11 | net.ActionMap = make(map[pb.ProtoCode]net.ActionHandler) |
10 | - | |
11 | 12 | net.ActionMap[pb.ProtoCode_HeartRpc] = HeartRpc |
12 | 13 | net.ActionMap[pb.ProtoCode_LoginRpc] = LoginRpc |
13 | 14 | net.ActionMap[pb.ProtoCode_CreateRpc] = CreateRpc |
14 | 15 | |
16 | +} | |
17 | + | |
18 | +func init() { | |
19 | + LoadRpc() | |
15 | 20 | } |
16 | 21 | \ No newline at end of file | ... | ... |
src/utils/md5.go deleted
src/utils/utils.go
1 | 1 | package utils |
2 | 2 | |
3 | 3 | import ( |
4 | + "crypto/md5" | |
5 | + "encoding/hex" | |
4 | 6 | "reflect" |
5 | 7 | "strings" |
6 | 8 | ) |
... | ... | @@ -44,4 +46,10 @@ func FindIndex(schema interface{}) (string, []string){ |
44 | 46 | } |
45 | 47 | } |
46 | 48 | return strings.ToLower(s.Name()), index |
49 | +} | |
50 | + | |
51 | +func Md5V(str string) string { | |
52 | + h := md5.New() | |
53 | + h.Write([]byte(str)) | |
54 | + return hex.EncodeToString(h.Sum(nil)) | |
47 | 55 | } |
48 | 56 | \ No newline at end of file | ... | ... |
test/client.go
... | ... | @@ -3,7 +3,9 @@ package main |
3 | 3 | import ( |
4 | 4 | "bytes" |
5 | 5 | "encoding/binary" |
6 | + "github.com/golang/protobuf/proto" | |
6 | 7 | "net" |
8 | + "pro2d/protos/pb" | |
7 | 9 | "pro2d/src/components/logger" |
8 | 10 | net2 "pro2d/src/components/net" |
9 | 11 | ) |
... | ... | @@ -12,15 +14,20 @@ func main() { |
12 | 14 | |
13 | 15 | head := &net2.Head{ |
14 | 16 | Length: 0, |
15 | - Cmd: 1, | |
17 | + Cmd: int32(pb.ProtoCode_LoginRpc), | |
16 | 18 | ErrCode: 0, |
17 | 19 | PreField: 0, |
18 | 20 | } |
19 | 21 | |
22 | + loginReq := &pb.LoginReq{ | |
23 | + Uid: "141815055745814528", | |
24 | + Device: "123123", | |
25 | + } | |
26 | + l, _ :=proto.Marshal(loginReq) | |
20 | 27 | |
21 | 28 | b := net2.MsgPkg{ |
22 | 29 | Head: head, |
23 | - Body: []byte("hello world"), | |
30 | + Body: l, | |
24 | 31 | } |
25 | 32 | head.Length = int32(16 + len(b.Body)) |
26 | 33 | buf := &bytes.Buffer{} |
... | ... | @@ -43,5 +50,4 @@ func main() { |
43 | 50 | return |
44 | 51 | } |
45 | 52 | client.Write(buf.Bytes()) |
46 | - select {} | |
47 | 53 | } |
48 | 54 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,16 @@ |
1 | +package main | |
2 | + | |
3 | +import ( | |
4 | + "fmt" | |
5 | + "testing" | |
6 | +) | |
7 | + | |
8 | +func TestGenerate_ReadCsvToStruct(t *testing.T) { | |
9 | + gt := NewGenerate("/Users/mac/Documents/project/Pro2D/Pro2DServer/csvdata", "int, string") | |
10 | + //err := gt.ReadCsvToStruct(*readPath) | |
11 | + err := gt.ReadCsvToMemory("/Users/mac/Documents/project/Pro2D/Pro2DServer/tools/") | |
12 | + if err != nil { | |
13 | + fmt.Printf("something err:%v\n", err) | |
14 | + return | |
15 | + } | |
16 | +} | ... | ... |
tools/main.go deleted
... | ... | @@ -1,29 +0,0 @@ |
1 | -package main | |
2 | - | |
3 | -import ( | |
4 | - "flag" | |
5 | - "fmt" | |
6 | - _ "pro2d/csvdata" | |
7 | -) | |
8 | - | |
9 | -var ( | |
10 | - savePath = flag.String("savePath", "/Users/mac/Documents/project/Pro2D/Pro2DServer/csvdata", "Path to save the makefile") | |
11 | - readPath = flag.String("readPath", "/Users/mac/Documents/project/Pro2D/Pro2DServer/tools/", "The path of reading Excel") | |
12 | - allType = flag.String("allType", "int, string", "Specified field type") | |
13 | -) | |
14 | - | |
15 | -func main() { | |
16 | - flag.Parse() | |
17 | - if *savePath == "" || *readPath == "" || *allType == "" { | |
18 | - fmt.Println("savePath, readPath or allType is nil") | |
19 | - return | |
20 | - } | |
21 | - | |
22 | - gt := NewGenerate(*savePath, *allType) | |
23 | - //err := gt.ReadCsvToStruct(*readPath) | |
24 | - err := gt.ReadCsvToMemory(*readPath) | |
25 | - if err != nil { | |
26 | - fmt.Printf("something err:%v\n", err) | |
27 | - return | |
28 | - } | |
29 | -} | |
30 | 0 | \ No newline at end of file |
tools/protostostruct.go
... | ... | @@ -14,7 +14,7 @@ var ( |
14 | 14 | ProtoCode = "syntax = \"proto3\";\noption go_package = \"./pb;pb\";\n\npackage protocode;\n\nenum ProtoCode\n{\n UNKNOWN = 0x000;\n %s\n}" |
15 | 15 | ProtoCodeLine = "\t%sRpc = %02x;\n" |
16 | 16 | |
17 | - GoProtoCodeStr = "package actions\n\nimport (\n\t\"pro2d/components/net\"\n\t\"pro2d/protos/pb\"\n)\n\nfunc init() {\n\tnet.ActionMap = make(map[pb.ProtoCode]net.ActionHandler)\n\n%s\n}" | |
17 | + GoProtoCodeStr = "package main\n\nimport (\n\t\"pro2d/protos/pb\"\n\t\"pro2d/src/components/logger\"\n\t\"pro2d/src/components/net\"\n)\n\nfunc LoadRpc() {\n\tlogger.Debug(\"init protocode...\")\n\tnet.ActionMap = make(map[pb.ProtoCode]net.ActionHandler)\n%s\n}\n\nfunc init() {\n\tLoadRpc()\n}" | |
18 | 18 | GoProtoCodeLine = "\tnet.ActionMap[pb.ProtoCode_%sRpc] = %sRpc\n" |
19 | 19 | ) |
20 | 20 | |
... | ... | @@ -98,7 +98,7 @@ func ReadProtos(readPath, OutPath string ) error { |
98 | 98 | return fmt.Errorf("WriteNewFile|Write is err:%v", err) |
99 | 99 | } |
100 | 100 | |
101 | - fw, err = os.OpenFile( OutPath+"actions/protocode.go", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) | |
101 | + fw, err = os.OpenFile( OutPath+"src/plugin/protocode.go", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) | |
102 | 102 | if err != nil { |
103 | 103 | return fmt.Errorf("WriteNewFile|OpenFile is err:%v", err) |
104 | 104 | } | ... | ... |