├── README.md ├── config ├── attr.go ├── bt.go ├── dataConfig │ ├── CfgPlayerAttr.bytes │ ├── CfgPlayerAttr.go │ └── CfgPlayerAttr.pb.go ├── doudizhu.go ├── protoConfig │ ├── CfgPlayerAttr.proto │ └── PlayerAttr(角色配置表).xlsx └── server.config ├── log └── 1111.log ├── proto ├── common.pb.go ├── common.proto ├── enumtype.pb.go ├── enumtype.proto ├── export.sh ├── login.pb.go ├── login.proto ├── rank.pb.go └── rank.proto ├── script └── ctl.sh ├── server ├── db │ ├── dbautoid.go │ ├── dbrank.go │ ├── dbuserattr.go │ ├── dbusermail.go │ ├── dbuserrank.go │ ├── dbusertask.go │ └── mysql.go ├── game │ ├── rank │ │ ├── powerrank.go │ │ └── rank.go │ └── user │ │ ├── player.go │ │ └── player_handler.go ├── global │ ├── enum.go │ ├── globalobj.go │ └── playertable.go ├── handler │ ├── pplogin.go │ └── pprank.go ├── include │ ├── ranktype.go │ └── usertype.go ├── main.go ├── network │ ├── command.go │ ├── packet.go │ └── tcp_server.go └── util │ ├── error.go │ ├── example_test.go │ ├── map.go │ └── rand.go ├── sql └── game.sql └── test ├── a └── ta.go ├── b └── tb.go ├── channelTest.go ├── client.go ├── closechan.go ├── code.go ├── contex.go ├── doudizhu.xlsx ├── exceltest.go ├── i └── tc.go ├── interface.go ├── interface2.go ├── interfaceTest.go ├── interfaceTest2.go ├── intest.go ├── kk.go ├── lock.go ├── maptest.go ├── methodTest.go ├── mysqltest2.go ├── mysqtest.go ├── objsort.go ├── pointTest.go ├── publish_subscribe.go ├── recover.go ├── refecttest.go ├── selecttest.go ├── slicetest.go ├── sort.go ├── syncMap.go ├── templete.go ├── test1.go ├── testclient.go ├── testserver.go └── utilsort.go /README.md: -------------------------------------------------------------------------------- 1 | # 使用golang从零开始搭建的一个游戏服务器 2 | # 协议使用protobuff,包头+包体 3 | # 数据库使用mysql 4 | 5 | 启动方式: 6 | 7 | cd slg_game_server/script 8 | 9 | 输入 ./ctl.sh start 10 | 11 | 或者 12 | 13 | cd slg_game_server/server 14 | 15 | 输入 go run main.go 16 | -------------------------------------------------------------------------------- /config/attr.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | 4 | type attr struct { 5 | Userid int 6 | Name string 7 | Level int 8 | Info []int 9 | Info1 attr1 10 | } 11 | 12 | type attr1 struct { 13 | a int 14 | b []int 15 | c string 16 | } 17 | 18 | func (a *attr)get_attr(key int) *attr { 19 | if key == 1 { 20 | return &attr{Userid:1, Name:"aa", Level:1, Info:[]int{12, 78, 50}, Info1:attr1{a:0,b:[]int{1,2,3},c:"a"}} 21 | } 22 | if key == 2 { 23 | return &attr{Userid:1, Name:"aa", Level:1, Info:[]int{12, 78, 50}} 24 | } 25 | if key == 3 { 26 | return &attr{Userid:1, Name:"aa", Level:1, Info:[]int{12, 78, 50}} 27 | } 28 | return nil 29 | } 30 | 31 | -------------------------------------------------------------------------------- /config/bt.go: -------------------------------------------------------------------------------- 1 | package config 2 | // 3 | //import ( 4 | // "time" 5 | // "fmt" 6 | //) 7 | // 8 | //type attr struct { 9 | // Userid int 10 | // Name string 11 | // Level int 12 | // 13 | //} 14 | // 15 | //func main() { 16 | // a := attr{} 17 | // for i := 0; i < 100000; i++ { 18 | // b := a.get_attr(1) 19 | // fmt.Println(b.Level) 20 | // } 21 | // 22 | // time.Sleep(10e9) 23 | //} 24 | // 25 | // 26 | //func (a *attr)get_attr(key int) attr { 27 | // if key == 1 { 28 | // return attr{Userid:1, Name:"aa", Level:1} 29 | // } 30 | // return attr{} 31 | //} 32 | // 33 | -------------------------------------------------------------------------------- /config/dataConfig/CfgPlayerAttr.bytes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huang2287832/slg_game_server/9dc7f6763021ab69ad6b74fdf956cb644cb64201/config/dataConfig/CfgPlayerAttr.bytes -------------------------------------------------------------------------------- /config/dataConfig/CfgPlayerAttr.go: -------------------------------------------------------------------------------- 1 | /* 2 | * This file generated by Acinconfig tool, don't modify it manually! 3 | * 4 | * proto content: 5 | //////////////////////////////////////////////////////////////////////// 6 | syntax = "proto3"; 7 | package dataConfig; 8 | 9 | // key:["id"] 10 | message CfgPlayerAttr{ 11 | int32 id = 1; //唯一id 12 | string key = 2; //系统key 13 | int32 initData = 3; //初始值 14 | int32 incData = 4; //增量值 15 | int32 maxData = 5; //最大值 16 | } 17 | 18 | message PlayerAttrConfigData{ 19 | repeated CfgPlayerAttr config = 1; 20 | } 21 | 22 | //////////////////////////////////////////////////////////////////////// 23 | */ 24 | 25 | package dataConfig 26 | 27 | import ( 28 | "github.com/golang/protobuf/proto" 29 | "io/ioutil" 30 | ) 31 | 32 | func getCfgPlayerAttrKey(id int32) int64 { 33 | return int64(id) 34 | } 35 | 36 | func GetCfgPlayerAttr(id int32) *CfgPlayerAttr { 37 | key := getCfgPlayerAttrKey(id) 38 | if item, ok := MapCfgPlayerAttr[key]; ok { 39 | return item 40 | } 41 | return nil 42 | } 43 | 44 | var MapCfgPlayerAttr map[int64]*CfgPlayerAttr = make(map[int64]*CfgPlayerAttr) 45 | 46 | func init() { 47 | data, err := ioutil.ReadFile("../../slg_game_server/config/dataConfig/CfgPlayerAttr.bytes") 48 | if err != nil { 49 | panic("file not exsit! ../../slg_game_server/config/dataConfig/CfgPlayerAttr.bytes") 50 | return 51 | } 52 | 53 | cfg := &PlayerAttrConfigData{} 54 | err = proto.Unmarshal(data, cfg) 55 | if err != nil { 56 | panic("proto data unmarshal fail!") 57 | return 58 | } 59 | 60 | for _, item := range cfg.Config { 61 | key := getCfgPlayerAttrKey(item.Id) 62 | MapCfgPlayerAttr[key] = item 63 | } 64 | } -------------------------------------------------------------------------------- /config/dataConfig/CfgPlayerAttr.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: CfgPlayerAttr.proto 3 | 4 | package dataConfig 5 | 6 | import proto "github.com/golang/protobuf/proto" 7 | import fmt "fmt" 8 | import math "math" 9 | 10 | // Reference imports to suppress errors if they are not otherwise used. 11 | var _ = proto.Marshal 12 | var _ = fmt.Errorf 13 | var _ = math.Inf 14 | 15 | // This is a compile-time assertion to ensure that this generated file 16 | // is compatible with the proto package it is being compiled against. 17 | // A compilation error at this line likely means your copy of the 18 | // proto package needs to be updated. 19 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 20 | 21 | // key:["id"] 22 | type CfgPlayerAttr struct { 23 | Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` 24 | Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` 25 | InitData int32 `protobuf:"varint,3,opt,name=initData,proto3" json:"initData,omitempty"` 26 | IncData int32 `protobuf:"varint,4,opt,name=incData,proto3" json:"incData,omitempty"` 27 | MaxData int32 `protobuf:"varint,5,opt,name=maxData,proto3" json:"maxData,omitempty"` 28 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 29 | XXX_unrecognized []byte `json:"-"` 30 | XXX_sizecache int32 `json:"-"` 31 | } 32 | 33 | func (m *CfgPlayerAttr) Reset() { *m = CfgPlayerAttr{} } 34 | func (m *CfgPlayerAttr) String() string { return proto.CompactTextString(m) } 35 | func (*CfgPlayerAttr) ProtoMessage() {} 36 | func (*CfgPlayerAttr) Descriptor() ([]byte, []int) { 37 | return fileDescriptor_CfgPlayerAttr_e6e2eb8248525846, []int{0} 38 | } 39 | func (m *CfgPlayerAttr) XXX_Unmarshal(b []byte) error { 40 | return xxx_messageInfo_CfgPlayerAttr.Unmarshal(m, b) 41 | } 42 | func (m *CfgPlayerAttr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 43 | return xxx_messageInfo_CfgPlayerAttr.Marshal(b, m, deterministic) 44 | } 45 | func (dst *CfgPlayerAttr) XXX_Merge(src proto.Message) { 46 | xxx_messageInfo_CfgPlayerAttr.Merge(dst, src) 47 | } 48 | func (m *CfgPlayerAttr) XXX_Size() int { 49 | return xxx_messageInfo_CfgPlayerAttr.Size(m) 50 | } 51 | func (m *CfgPlayerAttr) XXX_DiscardUnknown() { 52 | xxx_messageInfo_CfgPlayerAttr.DiscardUnknown(m) 53 | } 54 | 55 | var xxx_messageInfo_CfgPlayerAttr proto.InternalMessageInfo 56 | 57 | func (m *CfgPlayerAttr) GetId() int32 { 58 | if m != nil { 59 | return m.Id 60 | } 61 | return 0 62 | } 63 | 64 | func (m *CfgPlayerAttr) GetKey() string { 65 | if m != nil { 66 | return m.Key 67 | } 68 | return "" 69 | } 70 | 71 | func (m *CfgPlayerAttr) GetInitData() int32 { 72 | if m != nil { 73 | return m.InitData 74 | } 75 | return 0 76 | } 77 | 78 | func (m *CfgPlayerAttr) GetIncData() int32 { 79 | if m != nil { 80 | return m.IncData 81 | } 82 | return 0 83 | } 84 | 85 | func (m *CfgPlayerAttr) GetMaxData() int32 { 86 | if m != nil { 87 | return m.MaxData 88 | } 89 | return 0 90 | } 91 | 92 | type PlayerAttrConfigData struct { 93 | Config []*CfgPlayerAttr `protobuf:"bytes,1,rep,name=config,proto3" json:"config,omitempty"` 94 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 95 | XXX_unrecognized []byte `json:"-"` 96 | XXX_sizecache int32 `json:"-"` 97 | } 98 | 99 | func (m *PlayerAttrConfigData) Reset() { *m = PlayerAttrConfigData{} } 100 | func (m *PlayerAttrConfigData) String() string { return proto.CompactTextString(m) } 101 | func (*PlayerAttrConfigData) ProtoMessage() {} 102 | func (*PlayerAttrConfigData) Descriptor() ([]byte, []int) { 103 | return fileDescriptor_CfgPlayerAttr_e6e2eb8248525846, []int{1} 104 | } 105 | func (m *PlayerAttrConfigData) XXX_Unmarshal(b []byte) error { 106 | return xxx_messageInfo_PlayerAttrConfigData.Unmarshal(m, b) 107 | } 108 | func (m *PlayerAttrConfigData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 109 | return xxx_messageInfo_PlayerAttrConfigData.Marshal(b, m, deterministic) 110 | } 111 | func (dst *PlayerAttrConfigData) XXX_Merge(src proto.Message) { 112 | xxx_messageInfo_PlayerAttrConfigData.Merge(dst, src) 113 | } 114 | func (m *PlayerAttrConfigData) XXX_Size() int { 115 | return xxx_messageInfo_PlayerAttrConfigData.Size(m) 116 | } 117 | func (m *PlayerAttrConfigData) XXX_DiscardUnknown() { 118 | xxx_messageInfo_PlayerAttrConfigData.DiscardUnknown(m) 119 | } 120 | 121 | var xxx_messageInfo_PlayerAttrConfigData proto.InternalMessageInfo 122 | 123 | func (m *PlayerAttrConfigData) GetConfig() []*CfgPlayerAttr { 124 | if m != nil { 125 | return m.Config 126 | } 127 | return nil 128 | } 129 | 130 | func init() { 131 | proto.RegisterType((*CfgPlayerAttr)(nil), "dataConfig.CfgPlayerAttr") 132 | proto.RegisterType((*PlayerAttrConfigData)(nil), "dataConfig.PlayerAttrConfigData") 133 | } 134 | 135 | func init() { proto.RegisterFile("CfgPlayerAttr.proto", fileDescriptor_CfgPlayerAttr_e6e2eb8248525846) } 136 | 137 | var fileDescriptor_CfgPlayerAttr_e6e2eb8248525846 = []byte{ 138 | // 178 bytes of a gzipped FileDescriptorProto 139 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x76, 0x4e, 0x4b, 0x0f, 140 | 0xc8, 0x49, 0xac, 0x4c, 0x2d, 0x72, 0x2c, 0x29, 0x29, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 141 | 0xe2, 0x4a, 0x49, 0x2c, 0x49, 0x74, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0x57, 0x6a, 0x64, 0xe4, 0xe2, 142 | 0x45, 0x51, 0x23, 0xc4, 0xc7, 0xc5, 0x94, 0x99, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x1a, 0xc4, 143 | 0x94, 0x99, 0x22, 0x24, 0xc0, 0xc5, 0x9c, 0x9d, 0x5a, 0x29, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0x19, 144 | 0x04, 0x62, 0x0a, 0x49, 0x71, 0x71, 0x64, 0xe6, 0x65, 0x96, 0xb8, 0x24, 0x96, 0x24, 0x4a, 0x30, 145 | 0x83, 0xd5, 0xc1, 0xf9, 0x42, 0x12, 0x5c, 0xec, 0x99, 0x79, 0xc9, 0x60, 0x29, 0x16, 0xb0, 0x14, 146 | 0x8c, 0x0b, 0x92, 0xc9, 0x4d, 0xac, 0x00, 0xcb, 0xb0, 0x42, 0x64, 0xa0, 0x5c, 0x25, 0x4f, 0x2e, 147 | 0x11, 0x84, 0xfd, 0x10, 0x77, 0x81, 0x75, 0x18, 0x72, 0xb1, 0x25, 0x83, 0x79, 0x12, 0x8c, 0x0a, 148 | 0xcc, 0x1a, 0xdc, 0x46, 0x92, 0x7a, 0x08, 0x87, 0xeb, 0xa1, 0x38, 0x3a, 0x08, 0xaa, 0x30, 0x89, 149 | 0x0d, 0xec, 0x43, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0xe4, 0x95, 0xc3, 0xf8, 0x00, 150 | 0x00, 0x00, 151 | } 152 | -------------------------------------------------------------------------------- /config/doudizhu.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | type Doudizhu struct{ 4 | Pool_id int 5 | Round_time int 6 | Max_money int 7 | Match_time []int 8 | Desc string 9 | 10 | } 11 | 12 | func Get_attr(key int) *Doudizhu { 13 | 14 | if key == 1 { 15 | return &Doudizhu{Pool_id:1, Round_time:12, Max_money:10000, Match_time:[]int{3,4,5,6}, Desc:"fuck", } 16 | 17 | } 18 | if key == 2 { 19 | return &Doudizhu{Pool_id:2, Round_time:12, Max_money:50000, Match_time:[]int{3,4,5,7}, Desc:"fuck", } 20 | 21 | } 22 | if key == 3 { 23 | return &Doudizhu{Pool_id:3, Round_time:12, Max_money:100000, Match_time:[]int{3,4,5,8}, Desc:"fuck", } 24 | 25 | } 26 | if key == 4 { 27 | return &Doudizhu{Pool_id:4, Round_time:12, Max_money:300000, Match_time:[]int{3,4,5,9}, Desc:"fuck", } 28 | 29 | } 30 | return nil 31 | } -------------------------------------------------------------------------------- /config/protoConfig/CfgPlayerAttr.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package AHotfix.Config; 3 | 4 | // key:["id"] 5 | message CfgPlayerAttr{ 6 | int32 id = 1; //唯一id 7 | string key = 2; //系统key 8 | int32 initData = 3; //初始值 9 | int32 incData = 4; //增量值 10 | int32 maxData = 5; //最大值 11 | } 12 | 13 | message PlayerAttrConfigData{ 14 | repeated CfgPlayerAttr config = 1; 15 | } 16 | -------------------------------------------------------------------------------- /config/protoConfig/PlayerAttr(角色配置表).xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huang2287832/slg_game_server/9dc7f6763021ab69ad6b74fdf956cb644cb64201/config/protoConfig/PlayerAttr(角色配置表).xlsx -------------------------------------------------------------------------------- /config/server.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /log/1111.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huang2287832/slg_game_server/9dc7f6763021ab69ad6b74fdf956cb644cb64201/log/1111.log -------------------------------------------------------------------------------- /proto/common.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-gogo. DO NOT EDIT. 2 | // source: common.proto 3 | 4 | package proto 5 | 6 | import proto "github.com/golang/protobuf/proto" 7 | import fmt "fmt" 8 | import math "math" 9 | 10 | import io "io" 11 | 12 | // Reference imports to suppress errors if they are not otherwise used. 13 | var _ = proto.Marshal 14 | var _ = fmt.Errorf 15 | var _ = math.Inf 16 | 17 | // This is a compile-time assertion to ensure that this generated file 18 | // is compatible with the proto package it is being compiled against. 19 | // A compilation error at this line likely means your copy of the 20 | // proto package needs to be updated. 21 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 22 | 23 | // 心跳请求 24 | type HeartBeatReq struct { 25 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 26 | XXX_unrecognized []byte `json:"-"` 27 | XXX_sizecache int32 `json:"-"` 28 | } 29 | 30 | func (m *HeartBeatReq) Reset() { *m = HeartBeatReq{} } 31 | func (m *HeartBeatReq) String() string { return proto.CompactTextString(m) } 32 | func (*HeartBeatReq) ProtoMessage() {} 33 | func (*HeartBeatReq) Descriptor() ([]byte, []int) { 34 | return fileDescriptor_common_b75056ddf8c14f8b, []int{0} 35 | } 36 | func (m *HeartBeatReq) XXX_Unmarshal(b []byte) error { 37 | return m.Unmarshal(b) 38 | } 39 | func (m *HeartBeatReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 40 | if deterministic { 41 | return xxx_messageInfo_HeartBeatReq.Marshal(b, m, deterministic) 42 | } else { 43 | b = b[:cap(b)] 44 | n, err := m.MarshalTo(b) 45 | if err != nil { 46 | return nil, err 47 | } 48 | return b[:n], nil 49 | } 50 | } 51 | func (dst *HeartBeatReq) XXX_Merge(src proto.Message) { 52 | xxx_messageInfo_HeartBeatReq.Merge(dst, src) 53 | } 54 | func (m *HeartBeatReq) XXX_Size() int { 55 | return m.Size() 56 | } 57 | func (m *HeartBeatReq) XXX_DiscardUnknown() { 58 | xxx_messageInfo_HeartBeatReq.DiscardUnknown(m) 59 | } 60 | 61 | var xxx_messageInfo_HeartBeatReq proto.InternalMessageInfo 62 | 63 | // 心跳请求 64 | type HeartBeatResp struct { 65 | ServerSec int64 `protobuf:"varint,1,opt,name=server_sec,json=serverSec,proto3" json:"server_sec,omitempty"` 66 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 67 | XXX_unrecognized []byte `json:"-"` 68 | XXX_sizecache int32 `json:"-"` 69 | } 70 | 71 | func (m *HeartBeatResp) Reset() { *m = HeartBeatResp{} } 72 | func (m *HeartBeatResp) String() string { return proto.CompactTextString(m) } 73 | func (*HeartBeatResp) ProtoMessage() {} 74 | func (*HeartBeatResp) Descriptor() ([]byte, []int) { 75 | return fileDescriptor_common_b75056ddf8c14f8b, []int{1} 76 | } 77 | func (m *HeartBeatResp) XXX_Unmarshal(b []byte) error { 78 | return m.Unmarshal(b) 79 | } 80 | func (m *HeartBeatResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 81 | if deterministic { 82 | return xxx_messageInfo_HeartBeatResp.Marshal(b, m, deterministic) 83 | } else { 84 | b = b[:cap(b)] 85 | n, err := m.MarshalTo(b) 86 | if err != nil { 87 | return nil, err 88 | } 89 | return b[:n], nil 90 | } 91 | } 92 | func (dst *HeartBeatResp) XXX_Merge(src proto.Message) { 93 | xxx_messageInfo_HeartBeatResp.Merge(dst, src) 94 | } 95 | func (m *HeartBeatResp) XXX_Size() int { 96 | return m.Size() 97 | } 98 | func (m *HeartBeatResp) XXX_DiscardUnknown() { 99 | xxx_messageInfo_HeartBeatResp.DiscardUnknown(m) 100 | } 101 | 102 | var xxx_messageInfo_HeartBeatResp proto.InternalMessageInfo 103 | 104 | func (m *HeartBeatResp) GetServerSec() int64 { 105 | if m != nil { 106 | return m.ServerSec 107 | } 108 | return 0 109 | } 110 | 111 | // 服务端和客户端交互统一的错误码提示消息 112 | type ErrResp struct { 113 | Cmd ProtoCmd `protobuf:"varint,1,opt,name=cmd,proto3,enum=proto.ProtoCmd" json:"cmd,omitempty"` 114 | ErrCode int32 `protobuf:"varint,2,opt,name=err_code,json=errCode,proto3" json:"err_code,omitempty"` 115 | ErrMsg string `protobuf:"bytes,3,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` 116 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 117 | XXX_unrecognized []byte `json:"-"` 118 | XXX_sizecache int32 `json:"-"` 119 | } 120 | 121 | func (m *ErrResp) Reset() { *m = ErrResp{} } 122 | func (m *ErrResp) String() string { return proto.CompactTextString(m) } 123 | func (*ErrResp) ProtoMessage() {} 124 | func (*ErrResp) Descriptor() ([]byte, []int) { 125 | return fileDescriptor_common_b75056ddf8c14f8b, []int{2} 126 | } 127 | func (m *ErrResp) XXX_Unmarshal(b []byte) error { 128 | return m.Unmarshal(b) 129 | } 130 | func (m *ErrResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 131 | if deterministic { 132 | return xxx_messageInfo_ErrResp.Marshal(b, m, deterministic) 133 | } else { 134 | b = b[:cap(b)] 135 | n, err := m.MarshalTo(b) 136 | if err != nil { 137 | return nil, err 138 | } 139 | return b[:n], nil 140 | } 141 | } 142 | func (dst *ErrResp) XXX_Merge(src proto.Message) { 143 | xxx_messageInfo_ErrResp.Merge(dst, src) 144 | } 145 | func (m *ErrResp) XXX_Size() int { 146 | return m.Size() 147 | } 148 | func (m *ErrResp) XXX_DiscardUnknown() { 149 | xxx_messageInfo_ErrResp.DiscardUnknown(m) 150 | } 151 | 152 | var xxx_messageInfo_ErrResp proto.InternalMessageInfo 153 | 154 | func (m *ErrResp) GetCmd() ProtoCmd { 155 | if m != nil { 156 | return m.Cmd 157 | } 158 | return ProtoCmd_CMD_PASS 159 | } 160 | 161 | func (m *ErrResp) GetErrCode() int32 { 162 | if m != nil { 163 | return m.ErrCode 164 | } 165 | return 0 166 | } 167 | 168 | func (m *ErrResp) GetErrMsg() string { 169 | if m != nil { 170 | return m.ErrMsg 171 | } 172 | return "" 173 | } 174 | 175 | func init() { 176 | proto.RegisterType((*HeartBeatReq)(nil), "proto.HeartBeatReq") 177 | proto.RegisterType((*HeartBeatResp)(nil), "proto.HeartBeatResp") 178 | proto.RegisterType((*ErrResp)(nil), "proto.ErrResp") 179 | } 180 | func (m *HeartBeatReq) Marshal() (dAtA []byte, err error) { 181 | size := m.Size() 182 | dAtA = make([]byte, size) 183 | n, err := m.MarshalTo(dAtA) 184 | if err != nil { 185 | return nil, err 186 | } 187 | return dAtA[:n], nil 188 | } 189 | 190 | func (m *HeartBeatReq) MarshalTo(dAtA []byte) (int, error) { 191 | var i int 192 | _ = i 193 | var l int 194 | _ = l 195 | if m.XXX_unrecognized != nil { 196 | i += copy(dAtA[i:], m.XXX_unrecognized) 197 | } 198 | return i, nil 199 | } 200 | 201 | func (m *HeartBeatResp) Marshal() (dAtA []byte, err error) { 202 | size := m.Size() 203 | dAtA = make([]byte, size) 204 | n, err := m.MarshalTo(dAtA) 205 | if err != nil { 206 | return nil, err 207 | } 208 | return dAtA[:n], nil 209 | } 210 | 211 | func (m *HeartBeatResp) MarshalTo(dAtA []byte) (int, error) { 212 | var i int 213 | _ = i 214 | var l int 215 | _ = l 216 | if m.ServerSec != 0 { 217 | dAtA[i] = 0x8 218 | i++ 219 | i = encodeVarintCommon(dAtA, i, uint64(m.ServerSec)) 220 | } 221 | if m.XXX_unrecognized != nil { 222 | i += copy(dAtA[i:], m.XXX_unrecognized) 223 | } 224 | return i, nil 225 | } 226 | 227 | func (m *ErrResp) Marshal() (dAtA []byte, err error) { 228 | size := m.Size() 229 | dAtA = make([]byte, size) 230 | n, err := m.MarshalTo(dAtA) 231 | if err != nil { 232 | return nil, err 233 | } 234 | return dAtA[:n], nil 235 | } 236 | 237 | func (m *ErrResp) MarshalTo(dAtA []byte) (int, error) { 238 | var i int 239 | _ = i 240 | var l int 241 | _ = l 242 | if m.Cmd != 0 { 243 | dAtA[i] = 0x8 244 | i++ 245 | i = encodeVarintCommon(dAtA, i, uint64(m.Cmd)) 246 | } 247 | if m.ErrCode != 0 { 248 | dAtA[i] = 0x10 249 | i++ 250 | i = encodeVarintCommon(dAtA, i, uint64(m.ErrCode)) 251 | } 252 | if len(m.ErrMsg) > 0 { 253 | dAtA[i] = 0x1a 254 | i++ 255 | i = encodeVarintCommon(dAtA, i, uint64(len(m.ErrMsg))) 256 | i += copy(dAtA[i:], m.ErrMsg) 257 | } 258 | if m.XXX_unrecognized != nil { 259 | i += copy(dAtA[i:], m.XXX_unrecognized) 260 | } 261 | return i, nil 262 | } 263 | 264 | func encodeVarintCommon(dAtA []byte, offset int, v uint64) int { 265 | for v >= 1<<7 { 266 | dAtA[offset] = uint8(v&0x7f | 0x80) 267 | v >>= 7 268 | offset++ 269 | } 270 | dAtA[offset] = uint8(v) 271 | return offset + 1 272 | } 273 | func (m *HeartBeatReq) Size() (n int) { 274 | var l int 275 | _ = l 276 | if m.XXX_unrecognized != nil { 277 | n += len(m.XXX_unrecognized) 278 | } 279 | return n 280 | } 281 | 282 | func (m *HeartBeatResp) Size() (n int) { 283 | var l int 284 | _ = l 285 | if m.ServerSec != 0 { 286 | n += 1 + sovCommon(uint64(m.ServerSec)) 287 | } 288 | if m.XXX_unrecognized != nil { 289 | n += len(m.XXX_unrecognized) 290 | } 291 | return n 292 | } 293 | 294 | func (m *ErrResp) Size() (n int) { 295 | var l int 296 | _ = l 297 | if m.Cmd != 0 { 298 | n += 1 + sovCommon(uint64(m.Cmd)) 299 | } 300 | if m.ErrCode != 0 { 301 | n += 1 + sovCommon(uint64(m.ErrCode)) 302 | } 303 | l = len(m.ErrMsg) 304 | if l > 0 { 305 | n += 1 + l + sovCommon(uint64(l)) 306 | } 307 | if m.XXX_unrecognized != nil { 308 | n += len(m.XXX_unrecognized) 309 | } 310 | return n 311 | } 312 | 313 | func sovCommon(x uint64) (n int) { 314 | for { 315 | n++ 316 | x >>= 7 317 | if x == 0 { 318 | break 319 | } 320 | } 321 | return n 322 | } 323 | func sozCommon(x uint64) (n int) { 324 | return sovCommon(uint64((x << 1) ^ uint64((int64(x) >> 63)))) 325 | } 326 | func (m *HeartBeatReq) Unmarshal(dAtA []byte) error { 327 | l := len(dAtA) 328 | iNdEx := 0 329 | for iNdEx < l { 330 | preIndex := iNdEx 331 | var wire uint64 332 | for shift := uint(0); ; shift += 7 { 333 | if shift >= 64 { 334 | return ErrIntOverflowCommon 335 | } 336 | if iNdEx >= l { 337 | return io.ErrUnexpectedEOF 338 | } 339 | b := dAtA[iNdEx] 340 | iNdEx++ 341 | wire |= (uint64(b) & 0x7F) << shift 342 | if b < 0x80 { 343 | break 344 | } 345 | } 346 | fieldNum := int32(wire >> 3) 347 | wireType := int(wire & 0x7) 348 | if wireType == 4 { 349 | return fmt.Errorf("proto: HeartBeatReq: wiretype end group for non-group") 350 | } 351 | if fieldNum <= 0 { 352 | return fmt.Errorf("proto: HeartBeatReq: illegal tag %d (wire type %d)", fieldNum, wire) 353 | } 354 | switch fieldNum { 355 | default: 356 | iNdEx = preIndex 357 | skippy, err := skipCommon(dAtA[iNdEx:]) 358 | if err != nil { 359 | return err 360 | } 361 | if skippy < 0 { 362 | return ErrInvalidLengthCommon 363 | } 364 | if (iNdEx + skippy) > l { 365 | return io.ErrUnexpectedEOF 366 | } 367 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 368 | iNdEx += skippy 369 | } 370 | } 371 | 372 | if iNdEx > l { 373 | return io.ErrUnexpectedEOF 374 | } 375 | return nil 376 | } 377 | func (m *HeartBeatResp) Unmarshal(dAtA []byte) error { 378 | l := len(dAtA) 379 | iNdEx := 0 380 | for iNdEx < l { 381 | preIndex := iNdEx 382 | var wire uint64 383 | for shift := uint(0); ; shift += 7 { 384 | if shift >= 64 { 385 | return ErrIntOverflowCommon 386 | } 387 | if iNdEx >= l { 388 | return io.ErrUnexpectedEOF 389 | } 390 | b := dAtA[iNdEx] 391 | iNdEx++ 392 | wire |= (uint64(b) & 0x7F) << shift 393 | if b < 0x80 { 394 | break 395 | } 396 | } 397 | fieldNum := int32(wire >> 3) 398 | wireType := int(wire & 0x7) 399 | if wireType == 4 { 400 | return fmt.Errorf("proto: HeartBeatResp: wiretype end group for non-group") 401 | } 402 | if fieldNum <= 0 { 403 | return fmt.Errorf("proto: HeartBeatResp: illegal tag %d (wire type %d)", fieldNum, wire) 404 | } 405 | switch fieldNum { 406 | case 1: 407 | if wireType != 0 { 408 | return fmt.Errorf("proto: wrong wireType = %d for field ServerSec", wireType) 409 | } 410 | m.ServerSec = 0 411 | for shift := uint(0); ; shift += 7 { 412 | if shift >= 64 { 413 | return ErrIntOverflowCommon 414 | } 415 | if iNdEx >= l { 416 | return io.ErrUnexpectedEOF 417 | } 418 | b := dAtA[iNdEx] 419 | iNdEx++ 420 | m.ServerSec |= (int64(b) & 0x7F) << shift 421 | if b < 0x80 { 422 | break 423 | } 424 | } 425 | default: 426 | iNdEx = preIndex 427 | skippy, err := skipCommon(dAtA[iNdEx:]) 428 | if err != nil { 429 | return err 430 | } 431 | if skippy < 0 { 432 | return ErrInvalidLengthCommon 433 | } 434 | if (iNdEx + skippy) > l { 435 | return io.ErrUnexpectedEOF 436 | } 437 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 438 | iNdEx += skippy 439 | } 440 | } 441 | 442 | if iNdEx > l { 443 | return io.ErrUnexpectedEOF 444 | } 445 | return nil 446 | } 447 | func (m *ErrResp) Unmarshal(dAtA []byte) error { 448 | l := len(dAtA) 449 | iNdEx := 0 450 | for iNdEx < l { 451 | preIndex := iNdEx 452 | var wire uint64 453 | for shift := uint(0); ; shift += 7 { 454 | if shift >= 64 { 455 | return ErrIntOverflowCommon 456 | } 457 | if iNdEx >= l { 458 | return io.ErrUnexpectedEOF 459 | } 460 | b := dAtA[iNdEx] 461 | iNdEx++ 462 | wire |= (uint64(b) & 0x7F) << shift 463 | if b < 0x80 { 464 | break 465 | } 466 | } 467 | fieldNum := int32(wire >> 3) 468 | wireType := int(wire & 0x7) 469 | if wireType == 4 { 470 | return fmt.Errorf("proto: ErrResp: wiretype end group for non-group") 471 | } 472 | if fieldNum <= 0 { 473 | return fmt.Errorf("proto: ErrResp: illegal tag %d (wire type %d)", fieldNum, wire) 474 | } 475 | switch fieldNum { 476 | case 1: 477 | if wireType != 0 { 478 | return fmt.Errorf("proto: wrong wireType = %d for field Cmd", wireType) 479 | } 480 | m.Cmd = 0 481 | for shift := uint(0); ; shift += 7 { 482 | if shift >= 64 { 483 | return ErrIntOverflowCommon 484 | } 485 | if iNdEx >= l { 486 | return io.ErrUnexpectedEOF 487 | } 488 | b := dAtA[iNdEx] 489 | iNdEx++ 490 | m.Cmd |= (ProtoCmd(b) & 0x7F) << shift 491 | if b < 0x80 { 492 | break 493 | } 494 | } 495 | case 2: 496 | if wireType != 0 { 497 | return fmt.Errorf("proto: wrong wireType = %d for field ErrCode", wireType) 498 | } 499 | m.ErrCode = 0 500 | for shift := uint(0); ; shift += 7 { 501 | if shift >= 64 { 502 | return ErrIntOverflowCommon 503 | } 504 | if iNdEx >= l { 505 | return io.ErrUnexpectedEOF 506 | } 507 | b := dAtA[iNdEx] 508 | iNdEx++ 509 | m.ErrCode |= (int32(b) & 0x7F) << shift 510 | if b < 0x80 { 511 | break 512 | } 513 | } 514 | case 3: 515 | if wireType != 2 { 516 | return fmt.Errorf("proto: wrong wireType = %d for field ErrMsg", wireType) 517 | } 518 | var stringLen uint64 519 | for shift := uint(0); ; shift += 7 { 520 | if shift >= 64 { 521 | return ErrIntOverflowCommon 522 | } 523 | if iNdEx >= l { 524 | return io.ErrUnexpectedEOF 525 | } 526 | b := dAtA[iNdEx] 527 | iNdEx++ 528 | stringLen |= (uint64(b) & 0x7F) << shift 529 | if b < 0x80 { 530 | break 531 | } 532 | } 533 | intStringLen := int(stringLen) 534 | if intStringLen < 0 { 535 | return ErrInvalidLengthCommon 536 | } 537 | postIndex := iNdEx + intStringLen 538 | if postIndex > l { 539 | return io.ErrUnexpectedEOF 540 | } 541 | m.ErrMsg = string(dAtA[iNdEx:postIndex]) 542 | iNdEx = postIndex 543 | default: 544 | iNdEx = preIndex 545 | skippy, err := skipCommon(dAtA[iNdEx:]) 546 | if err != nil { 547 | return err 548 | } 549 | if skippy < 0 { 550 | return ErrInvalidLengthCommon 551 | } 552 | if (iNdEx + skippy) > l { 553 | return io.ErrUnexpectedEOF 554 | } 555 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 556 | iNdEx += skippy 557 | } 558 | } 559 | 560 | if iNdEx > l { 561 | return io.ErrUnexpectedEOF 562 | } 563 | return nil 564 | } 565 | func skipCommon(dAtA []byte) (n int, err error) { 566 | l := len(dAtA) 567 | iNdEx := 0 568 | for iNdEx < l { 569 | var wire uint64 570 | for shift := uint(0); ; shift += 7 { 571 | if shift >= 64 { 572 | return 0, ErrIntOverflowCommon 573 | } 574 | if iNdEx >= l { 575 | return 0, io.ErrUnexpectedEOF 576 | } 577 | b := dAtA[iNdEx] 578 | iNdEx++ 579 | wire |= (uint64(b) & 0x7F) << shift 580 | if b < 0x80 { 581 | break 582 | } 583 | } 584 | wireType := int(wire & 0x7) 585 | switch wireType { 586 | case 0: 587 | for shift := uint(0); ; shift += 7 { 588 | if shift >= 64 { 589 | return 0, ErrIntOverflowCommon 590 | } 591 | if iNdEx >= l { 592 | return 0, io.ErrUnexpectedEOF 593 | } 594 | iNdEx++ 595 | if dAtA[iNdEx-1] < 0x80 { 596 | break 597 | } 598 | } 599 | return iNdEx, nil 600 | case 1: 601 | iNdEx += 8 602 | return iNdEx, nil 603 | case 2: 604 | var length int 605 | for shift := uint(0); ; shift += 7 { 606 | if shift >= 64 { 607 | return 0, ErrIntOverflowCommon 608 | } 609 | if iNdEx >= l { 610 | return 0, io.ErrUnexpectedEOF 611 | } 612 | b := dAtA[iNdEx] 613 | iNdEx++ 614 | length |= (int(b) & 0x7F) << shift 615 | if b < 0x80 { 616 | break 617 | } 618 | } 619 | iNdEx += length 620 | if length < 0 { 621 | return 0, ErrInvalidLengthCommon 622 | } 623 | return iNdEx, nil 624 | case 3: 625 | for { 626 | var innerWire uint64 627 | var start int = iNdEx 628 | for shift := uint(0); ; shift += 7 { 629 | if shift >= 64 { 630 | return 0, ErrIntOverflowCommon 631 | } 632 | if iNdEx >= l { 633 | return 0, io.ErrUnexpectedEOF 634 | } 635 | b := dAtA[iNdEx] 636 | iNdEx++ 637 | innerWire |= (uint64(b) & 0x7F) << shift 638 | if b < 0x80 { 639 | break 640 | } 641 | } 642 | innerWireType := int(innerWire & 0x7) 643 | if innerWireType == 4 { 644 | break 645 | } 646 | next, err := skipCommon(dAtA[start:]) 647 | if err != nil { 648 | return 0, err 649 | } 650 | iNdEx = start + next 651 | } 652 | return iNdEx, nil 653 | case 4: 654 | return iNdEx, nil 655 | case 5: 656 | iNdEx += 4 657 | return iNdEx, nil 658 | default: 659 | return 0, fmt.Errorf("proto: illegal wireType %d", wireType) 660 | } 661 | } 662 | panic("unreachable") 663 | } 664 | 665 | var ( 666 | ErrInvalidLengthCommon = fmt.Errorf("proto: negative length found during unmarshaling") 667 | ErrIntOverflowCommon = fmt.Errorf("proto: integer overflow") 668 | ) 669 | 670 | func init() { proto.RegisterFile("common.proto", fileDescriptor_common_b75056ddf8c14f8b) } 671 | 672 | var fileDescriptor_common_b75056ddf8c14f8b = []byte{ 673 | // 210 bytes of a gzipped FileDescriptorProto 674 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0xce, 0xcf, 0xcd, 675 | 0xcd, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x05, 0x53, 0x52, 0x7c, 0xa9, 0x79, 676 | 0xa5, 0xb9, 0x25, 0x95, 0x05, 0xa9, 0x10, 0x61, 0x25, 0x3e, 0x2e, 0x1e, 0x8f, 0xd4, 0xc4, 0xa2, 677 | 0x12, 0xa7, 0xd4, 0xc4, 0x92, 0xa0, 0xd4, 0x42, 0x25, 0x3d, 0x2e, 0x5e, 0x24, 0x7e, 0x71, 0x81, 678 | 0x90, 0x2c, 0x17, 0x57, 0x71, 0x6a, 0x51, 0x59, 0x6a, 0x51, 0x7c, 0x71, 0x6a, 0xb2, 0x04, 0xa3, 679 | 0x02, 0xa3, 0x06, 0x73, 0x10, 0x27, 0x44, 0x24, 0x38, 0x35, 0x59, 0x29, 0x81, 0x8b, 0xdd, 0xb5, 680 | 0xa8, 0x08, 0xac, 0x52, 0x91, 0x8b, 0x39, 0x39, 0x37, 0x05, 0xac, 0x84, 0xcf, 0x88, 0x1f, 0x62, 681 | 0xbe, 0x5e, 0x00, 0x88, 0x74, 0xce, 0x4d, 0x09, 0x02, 0xc9, 0x09, 0x49, 0x72, 0x71, 0xa4, 0x16, 682 | 0x15, 0xc5, 0x27, 0xe7, 0xa7, 0xa4, 0x4a, 0x30, 0x29, 0x30, 0x6a, 0xb0, 0x06, 0xb1, 0xa7, 0x16, 683 | 0x15, 0x39, 0xe7, 0xa7, 0xa4, 0x0a, 0x89, 0x73, 0x81, 0x98, 0xf1, 0xb9, 0xc5, 0xe9, 0x12, 0xcc, 684 | 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x6c, 0xa9, 0x45, 0x45, 0xbe, 0xc5, 0xe9, 0x4e, 0x02, 0x27, 0x1e, 685 | 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x8c, 0xc7, 0x72, 0x0c, 0x49, 686 | 0x6c, 0x60, 0xa3, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xf6, 0xb6, 0xbe, 0xe1, 0x00, 687 | 0x00, 0x00, 688 | } 689 | -------------------------------------------------------------------------------- /proto/common.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | import "enumtype.proto"; 4 | 5 | package proto; 6 | 7 | // ------------------------------------------------------- 8 | // 测试协议 9 | // 封包格式:包头 + 包体 包头8个字节,协议号cmd 4个字节,包体长度2个字节,预留2个字节 10 | // ------------------------------------------------------- 11 | 12 | // 心跳请求 13 | message HeartBeatReq {} 14 | 15 | // 心跳请求 16 | message HeartBeatResp { 17 | int64 server_sec = 1; 18 | } 19 | 20 | // 服务端和客户端交互统一的错误码提示消息 21 | message ErrResp { 22 | ProtoCmd cmd = 1; 23 | int32 err_code = 2; 24 | string err_msg = 3; 25 | } -------------------------------------------------------------------------------- /proto/enumtype.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-gogo. DO NOT EDIT. 2 | // source: enumtype.proto 3 | 4 | package proto 5 | 6 | import proto "github.com/golang/protobuf/proto" 7 | import fmt "fmt" 8 | import math "math" 9 | 10 | import io "io" 11 | 12 | // Reference imports to suppress errors if they are not otherwise used. 13 | var _ = proto.Marshal 14 | var _ = fmt.Errorf 15 | var _ = math.Inf 16 | 17 | // This is a compile-time assertion to ensure that this generated file 18 | // is compatible with the proto package it is being compiled against. 19 | // A compilation error at this line likely means your copy of the 20 | // proto package needs to be updated. 21 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 22 | 23 | type ProtoCmd int32 24 | 25 | const ( 26 | ProtoCmd_CMD_PASS ProtoCmd = 0 27 | ProtoCmd_CMD_ErrResp ProtoCmd = 1 28 | ProtoCmd_CMD_HeartBeatReq ProtoCmd = 2 29 | ProtoCmd_CMD_HeartBeatResp ProtoCmd = 3 30 | ProtoCmd_CMD_LoginReq ProtoCmd = 1001 31 | ProtoCmd_CMD_LoginResp ProtoCmd = 1002 32 | ProtoCmd_CMD_LogoutReq ProtoCmd = 1003 33 | ProtoCmd_CMD_ShowRankReq ProtoCmd = 2001 34 | ProtoCmd_CMD_ShowRankResp ProtoCmd = 2002 35 | ) 36 | 37 | var ProtoCmd_name = map[int32]string{ 38 | 0: "CMD_PASS", 39 | 1: "CMD_ErrResp", 40 | 2: "CMD_HeartBeatReq", 41 | 3: "CMD_HeartBeatResp", 42 | 1001: "CMD_LoginReq", 43 | 1002: "CMD_LoginResp", 44 | 1003: "CMD_LogoutReq", 45 | 2001: "CMD_ShowRankReq", 46 | 2002: "CMD_ShowRankResp", 47 | } 48 | var ProtoCmd_value = map[string]int32{ 49 | "CMD_PASS": 0, 50 | "CMD_ErrResp": 1, 51 | "CMD_HeartBeatReq": 2, 52 | "CMD_HeartBeatResp": 3, 53 | "CMD_LoginReq": 1001, 54 | "CMD_LoginResp": 1002, 55 | "CMD_LogoutReq": 1003, 56 | "CMD_ShowRankReq": 2001, 57 | "CMD_ShowRankResp": 2002, 58 | } 59 | 60 | func (x ProtoCmd) String() string { 61 | return proto.EnumName(ProtoCmd_name, int32(x)) 62 | } 63 | func (ProtoCmd) EnumDescriptor() ([]byte, []int) { 64 | return fileDescriptor_enumtype_829a9ecd51d5f7be, []int{0} 65 | } 66 | 67 | type RankEnum int32 68 | 69 | const ( 70 | RankEnum_Rank_Pass RankEnum = 0 71 | RankEnum_Rank_Power RankEnum = 1 72 | ) 73 | 74 | var RankEnum_name = map[int32]string{ 75 | 0: "Rank_Pass", 76 | 1: "Rank_Power", 77 | } 78 | var RankEnum_value = map[string]int32{ 79 | "Rank_Pass": 0, 80 | "Rank_Power": 1, 81 | } 82 | 83 | func (x RankEnum) String() string { 84 | return proto.EnumName(RankEnum_name, int32(x)) 85 | } 86 | func (RankEnum) EnumDescriptor() ([]byte, []int) { 87 | return fileDescriptor_enumtype_829a9ecd51d5f7be, []int{1} 88 | } 89 | 90 | type PlayerAttr struct { 91 | UserId int32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` 92 | NickName string `protobuf:"bytes,2,opt,name=nick_name,json=nickName,proto3" json:"nick_name,omitempty"` 93 | Sign string `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign,omitempty"` 94 | X int32 `protobuf:"varint,4,opt,name=X,proto3" json:"X,omitempty"` 95 | Y int32 `protobuf:"varint,5,opt,name=Y,proto3" json:"Y,omitempty"` 96 | Country int32 `protobuf:"varint,6,opt,name=Country,proto3" json:"Country,omitempty"` 97 | Level int32 `protobuf:"varint,7,opt,name=Level,proto3" json:"Level,omitempty"` 98 | Exp int32 `protobuf:"varint,8,opt,name=Exp,proto3" json:"Exp,omitempty"` 99 | Wood int32 `protobuf:"varint,9,opt,name=Wood,proto3" json:"Wood,omitempty"` 100 | Iron int32 `protobuf:"varint,10,opt,name=Iron,proto3" json:"Iron,omitempty"` 101 | Stone int32 `protobuf:"varint,11,opt,name=Stone,proto3" json:"Stone,omitempty"` 102 | Forage int32 `protobuf:"varint,12,opt,name=Forage,proto3" json:"Forage,omitempty"` 103 | Gold int32 `protobuf:"varint,13,opt,name=Gold,proto3" json:"Gold,omitempty"` 104 | Diamond int32 `protobuf:"varint,14,opt,name=Diamond,proto3" json:"Diamond,omitempty"` 105 | BindDiamond int32 `protobuf:"varint,15,opt,name=BindDiamond,proto3" json:"BindDiamond,omitempty"` 106 | Decree int32 `protobuf:"varint,16,opt,name=Decree,proto3" json:"Decree,omitempty"` 107 | ArmyOrder int32 `protobuf:"varint,17,opt,name=ArmyOrder,proto3" json:"ArmyOrder,omitempty"` 108 | Power int32 `protobuf:"varint,18,opt,name=Power,proto3" json:"Power,omitempty"` 109 | Domain int32 `protobuf:"varint,19,opt,name=Domain,proto3" json:"Domain,omitempty"` 110 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 111 | XXX_unrecognized []byte `json:"-"` 112 | XXX_sizecache int32 `json:"-"` 113 | } 114 | 115 | func (m *PlayerAttr) Reset() { *m = PlayerAttr{} } 116 | func (m *PlayerAttr) String() string { return proto.CompactTextString(m) } 117 | func (*PlayerAttr) ProtoMessage() {} 118 | func (*PlayerAttr) Descriptor() ([]byte, []int) { 119 | return fileDescriptor_enumtype_829a9ecd51d5f7be, []int{0} 120 | } 121 | func (m *PlayerAttr) XXX_Unmarshal(b []byte) error { 122 | return m.Unmarshal(b) 123 | } 124 | func (m *PlayerAttr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 125 | if deterministic { 126 | return xxx_messageInfo_PlayerAttr.Marshal(b, m, deterministic) 127 | } else { 128 | b = b[:cap(b)] 129 | n, err := m.MarshalTo(b) 130 | if err != nil { 131 | return nil, err 132 | } 133 | return b[:n], nil 134 | } 135 | } 136 | func (dst *PlayerAttr) XXX_Merge(src proto.Message) { 137 | xxx_messageInfo_PlayerAttr.Merge(dst, src) 138 | } 139 | func (m *PlayerAttr) XXX_Size() int { 140 | return m.Size() 141 | } 142 | func (m *PlayerAttr) XXX_DiscardUnknown() { 143 | xxx_messageInfo_PlayerAttr.DiscardUnknown(m) 144 | } 145 | 146 | var xxx_messageInfo_PlayerAttr proto.InternalMessageInfo 147 | 148 | func (m *PlayerAttr) GetUserId() int32 { 149 | if m != nil { 150 | return m.UserId 151 | } 152 | return 0 153 | } 154 | 155 | func (m *PlayerAttr) GetNickName() string { 156 | if m != nil { 157 | return m.NickName 158 | } 159 | return "" 160 | } 161 | 162 | func (m *PlayerAttr) GetSign() string { 163 | if m != nil { 164 | return m.Sign 165 | } 166 | return "" 167 | } 168 | 169 | func (m *PlayerAttr) GetX() int32 { 170 | if m != nil { 171 | return m.X 172 | } 173 | return 0 174 | } 175 | 176 | func (m *PlayerAttr) GetY() int32 { 177 | if m != nil { 178 | return m.Y 179 | } 180 | return 0 181 | } 182 | 183 | func (m *PlayerAttr) GetCountry() int32 { 184 | if m != nil { 185 | return m.Country 186 | } 187 | return 0 188 | } 189 | 190 | func (m *PlayerAttr) GetLevel() int32 { 191 | if m != nil { 192 | return m.Level 193 | } 194 | return 0 195 | } 196 | 197 | func (m *PlayerAttr) GetExp() int32 { 198 | if m != nil { 199 | return m.Exp 200 | } 201 | return 0 202 | } 203 | 204 | func (m *PlayerAttr) GetWood() int32 { 205 | if m != nil { 206 | return m.Wood 207 | } 208 | return 0 209 | } 210 | 211 | func (m *PlayerAttr) GetIron() int32 { 212 | if m != nil { 213 | return m.Iron 214 | } 215 | return 0 216 | } 217 | 218 | func (m *PlayerAttr) GetStone() int32 { 219 | if m != nil { 220 | return m.Stone 221 | } 222 | return 0 223 | } 224 | 225 | func (m *PlayerAttr) GetForage() int32 { 226 | if m != nil { 227 | return m.Forage 228 | } 229 | return 0 230 | } 231 | 232 | func (m *PlayerAttr) GetGold() int32 { 233 | if m != nil { 234 | return m.Gold 235 | } 236 | return 0 237 | } 238 | 239 | func (m *PlayerAttr) GetDiamond() int32 { 240 | if m != nil { 241 | return m.Diamond 242 | } 243 | return 0 244 | } 245 | 246 | func (m *PlayerAttr) GetBindDiamond() int32 { 247 | if m != nil { 248 | return m.BindDiamond 249 | } 250 | return 0 251 | } 252 | 253 | func (m *PlayerAttr) GetDecree() int32 { 254 | if m != nil { 255 | return m.Decree 256 | } 257 | return 0 258 | } 259 | 260 | func (m *PlayerAttr) GetArmyOrder() int32 { 261 | if m != nil { 262 | return m.ArmyOrder 263 | } 264 | return 0 265 | } 266 | 267 | func (m *PlayerAttr) GetPower() int32 { 268 | if m != nil { 269 | return m.Power 270 | } 271 | return 0 272 | } 273 | 274 | func (m *PlayerAttr) GetDomain() int32 { 275 | if m != nil { 276 | return m.Domain 277 | } 278 | return 0 279 | } 280 | 281 | func init() { 282 | proto.RegisterType((*PlayerAttr)(nil), "proto.PlayerAttr") 283 | proto.RegisterEnum("proto.ProtoCmd", ProtoCmd_name, ProtoCmd_value) 284 | proto.RegisterEnum("proto.RankEnum", RankEnum_name, RankEnum_value) 285 | } 286 | func (m *PlayerAttr) Marshal() (dAtA []byte, err error) { 287 | size := m.Size() 288 | dAtA = make([]byte, size) 289 | n, err := m.MarshalTo(dAtA) 290 | if err != nil { 291 | return nil, err 292 | } 293 | return dAtA[:n], nil 294 | } 295 | 296 | func (m *PlayerAttr) MarshalTo(dAtA []byte) (int, error) { 297 | var i int 298 | _ = i 299 | var l int 300 | _ = l 301 | if m.UserId != 0 { 302 | dAtA[i] = 0x8 303 | i++ 304 | i = encodeVarintEnumtype(dAtA, i, uint64(m.UserId)) 305 | } 306 | if len(m.NickName) > 0 { 307 | dAtA[i] = 0x12 308 | i++ 309 | i = encodeVarintEnumtype(dAtA, i, uint64(len(m.NickName))) 310 | i += copy(dAtA[i:], m.NickName) 311 | } 312 | if len(m.Sign) > 0 { 313 | dAtA[i] = 0x1a 314 | i++ 315 | i = encodeVarintEnumtype(dAtA, i, uint64(len(m.Sign))) 316 | i += copy(dAtA[i:], m.Sign) 317 | } 318 | if m.X != 0 { 319 | dAtA[i] = 0x20 320 | i++ 321 | i = encodeVarintEnumtype(dAtA, i, uint64(m.X)) 322 | } 323 | if m.Y != 0 { 324 | dAtA[i] = 0x28 325 | i++ 326 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Y)) 327 | } 328 | if m.Country != 0 { 329 | dAtA[i] = 0x30 330 | i++ 331 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Country)) 332 | } 333 | if m.Level != 0 { 334 | dAtA[i] = 0x38 335 | i++ 336 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Level)) 337 | } 338 | if m.Exp != 0 { 339 | dAtA[i] = 0x40 340 | i++ 341 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Exp)) 342 | } 343 | if m.Wood != 0 { 344 | dAtA[i] = 0x48 345 | i++ 346 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Wood)) 347 | } 348 | if m.Iron != 0 { 349 | dAtA[i] = 0x50 350 | i++ 351 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Iron)) 352 | } 353 | if m.Stone != 0 { 354 | dAtA[i] = 0x58 355 | i++ 356 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Stone)) 357 | } 358 | if m.Forage != 0 { 359 | dAtA[i] = 0x60 360 | i++ 361 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Forage)) 362 | } 363 | if m.Gold != 0 { 364 | dAtA[i] = 0x68 365 | i++ 366 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Gold)) 367 | } 368 | if m.Diamond != 0 { 369 | dAtA[i] = 0x70 370 | i++ 371 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Diamond)) 372 | } 373 | if m.BindDiamond != 0 { 374 | dAtA[i] = 0x78 375 | i++ 376 | i = encodeVarintEnumtype(dAtA, i, uint64(m.BindDiamond)) 377 | } 378 | if m.Decree != 0 { 379 | dAtA[i] = 0x80 380 | i++ 381 | dAtA[i] = 0x1 382 | i++ 383 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Decree)) 384 | } 385 | if m.ArmyOrder != 0 { 386 | dAtA[i] = 0x88 387 | i++ 388 | dAtA[i] = 0x1 389 | i++ 390 | i = encodeVarintEnumtype(dAtA, i, uint64(m.ArmyOrder)) 391 | } 392 | if m.Power != 0 { 393 | dAtA[i] = 0x90 394 | i++ 395 | dAtA[i] = 0x1 396 | i++ 397 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Power)) 398 | } 399 | if m.Domain != 0 { 400 | dAtA[i] = 0x98 401 | i++ 402 | dAtA[i] = 0x1 403 | i++ 404 | i = encodeVarintEnumtype(dAtA, i, uint64(m.Domain)) 405 | } 406 | if m.XXX_unrecognized != nil { 407 | i += copy(dAtA[i:], m.XXX_unrecognized) 408 | } 409 | return i, nil 410 | } 411 | 412 | func encodeVarintEnumtype(dAtA []byte, offset int, v uint64) int { 413 | for v >= 1<<7 { 414 | dAtA[offset] = uint8(v&0x7f | 0x80) 415 | v >>= 7 416 | offset++ 417 | } 418 | dAtA[offset] = uint8(v) 419 | return offset + 1 420 | } 421 | func (m *PlayerAttr) Size() (n int) { 422 | var l int 423 | _ = l 424 | if m.UserId != 0 { 425 | n += 1 + sovEnumtype(uint64(m.UserId)) 426 | } 427 | l = len(m.NickName) 428 | if l > 0 { 429 | n += 1 + l + sovEnumtype(uint64(l)) 430 | } 431 | l = len(m.Sign) 432 | if l > 0 { 433 | n += 1 + l + sovEnumtype(uint64(l)) 434 | } 435 | if m.X != 0 { 436 | n += 1 + sovEnumtype(uint64(m.X)) 437 | } 438 | if m.Y != 0 { 439 | n += 1 + sovEnumtype(uint64(m.Y)) 440 | } 441 | if m.Country != 0 { 442 | n += 1 + sovEnumtype(uint64(m.Country)) 443 | } 444 | if m.Level != 0 { 445 | n += 1 + sovEnumtype(uint64(m.Level)) 446 | } 447 | if m.Exp != 0 { 448 | n += 1 + sovEnumtype(uint64(m.Exp)) 449 | } 450 | if m.Wood != 0 { 451 | n += 1 + sovEnumtype(uint64(m.Wood)) 452 | } 453 | if m.Iron != 0 { 454 | n += 1 + sovEnumtype(uint64(m.Iron)) 455 | } 456 | if m.Stone != 0 { 457 | n += 1 + sovEnumtype(uint64(m.Stone)) 458 | } 459 | if m.Forage != 0 { 460 | n += 1 + sovEnumtype(uint64(m.Forage)) 461 | } 462 | if m.Gold != 0 { 463 | n += 1 + sovEnumtype(uint64(m.Gold)) 464 | } 465 | if m.Diamond != 0 { 466 | n += 1 + sovEnumtype(uint64(m.Diamond)) 467 | } 468 | if m.BindDiamond != 0 { 469 | n += 1 + sovEnumtype(uint64(m.BindDiamond)) 470 | } 471 | if m.Decree != 0 { 472 | n += 2 + sovEnumtype(uint64(m.Decree)) 473 | } 474 | if m.ArmyOrder != 0 { 475 | n += 2 + sovEnumtype(uint64(m.ArmyOrder)) 476 | } 477 | if m.Power != 0 { 478 | n += 2 + sovEnumtype(uint64(m.Power)) 479 | } 480 | if m.Domain != 0 { 481 | n += 2 + sovEnumtype(uint64(m.Domain)) 482 | } 483 | if m.XXX_unrecognized != nil { 484 | n += len(m.XXX_unrecognized) 485 | } 486 | return n 487 | } 488 | 489 | func sovEnumtype(x uint64) (n int) { 490 | for { 491 | n++ 492 | x >>= 7 493 | if x == 0 { 494 | break 495 | } 496 | } 497 | return n 498 | } 499 | func sozEnumtype(x uint64) (n int) { 500 | return sovEnumtype(uint64((x << 1) ^ uint64((int64(x) >> 63)))) 501 | } 502 | func (m *PlayerAttr) Unmarshal(dAtA []byte) error { 503 | l := len(dAtA) 504 | iNdEx := 0 505 | for iNdEx < l { 506 | preIndex := iNdEx 507 | var wire uint64 508 | for shift := uint(0); ; shift += 7 { 509 | if shift >= 64 { 510 | return ErrIntOverflowEnumtype 511 | } 512 | if iNdEx >= l { 513 | return io.ErrUnexpectedEOF 514 | } 515 | b := dAtA[iNdEx] 516 | iNdEx++ 517 | wire |= (uint64(b) & 0x7F) << shift 518 | if b < 0x80 { 519 | break 520 | } 521 | } 522 | fieldNum := int32(wire >> 3) 523 | wireType := int(wire & 0x7) 524 | if wireType == 4 { 525 | return fmt.Errorf("proto: PlayerAttr: wiretype end group for non-group") 526 | } 527 | if fieldNum <= 0 { 528 | return fmt.Errorf("proto: PlayerAttr: illegal tag %d (wire type %d)", fieldNum, wire) 529 | } 530 | switch fieldNum { 531 | case 1: 532 | if wireType != 0 { 533 | return fmt.Errorf("proto: wrong wireType = %d for field UserId", wireType) 534 | } 535 | m.UserId = 0 536 | for shift := uint(0); ; shift += 7 { 537 | if shift >= 64 { 538 | return ErrIntOverflowEnumtype 539 | } 540 | if iNdEx >= l { 541 | return io.ErrUnexpectedEOF 542 | } 543 | b := dAtA[iNdEx] 544 | iNdEx++ 545 | m.UserId |= (int32(b) & 0x7F) << shift 546 | if b < 0x80 { 547 | break 548 | } 549 | } 550 | case 2: 551 | if wireType != 2 { 552 | return fmt.Errorf("proto: wrong wireType = %d for field NickName", wireType) 553 | } 554 | var stringLen uint64 555 | for shift := uint(0); ; shift += 7 { 556 | if shift >= 64 { 557 | return ErrIntOverflowEnumtype 558 | } 559 | if iNdEx >= l { 560 | return io.ErrUnexpectedEOF 561 | } 562 | b := dAtA[iNdEx] 563 | iNdEx++ 564 | stringLen |= (uint64(b) & 0x7F) << shift 565 | if b < 0x80 { 566 | break 567 | } 568 | } 569 | intStringLen := int(stringLen) 570 | if intStringLen < 0 { 571 | return ErrInvalidLengthEnumtype 572 | } 573 | postIndex := iNdEx + intStringLen 574 | if postIndex > l { 575 | return io.ErrUnexpectedEOF 576 | } 577 | m.NickName = string(dAtA[iNdEx:postIndex]) 578 | iNdEx = postIndex 579 | case 3: 580 | if wireType != 2 { 581 | return fmt.Errorf("proto: wrong wireType = %d for field Sign", wireType) 582 | } 583 | var stringLen uint64 584 | for shift := uint(0); ; shift += 7 { 585 | if shift >= 64 { 586 | return ErrIntOverflowEnumtype 587 | } 588 | if iNdEx >= l { 589 | return io.ErrUnexpectedEOF 590 | } 591 | b := dAtA[iNdEx] 592 | iNdEx++ 593 | stringLen |= (uint64(b) & 0x7F) << shift 594 | if b < 0x80 { 595 | break 596 | } 597 | } 598 | intStringLen := int(stringLen) 599 | if intStringLen < 0 { 600 | return ErrInvalidLengthEnumtype 601 | } 602 | postIndex := iNdEx + intStringLen 603 | if postIndex > l { 604 | return io.ErrUnexpectedEOF 605 | } 606 | m.Sign = string(dAtA[iNdEx:postIndex]) 607 | iNdEx = postIndex 608 | case 4: 609 | if wireType != 0 { 610 | return fmt.Errorf("proto: wrong wireType = %d for field X", wireType) 611 | } 612 | m.X = 0 613 | for shift := uint(0); ; shift += 7 { 614 | if shift >= 64 { 615 | return ErrIntOverflowEnumtype 616 | } 617 | if iNdEx >= l { 618 | return io.ErrUnexpectedEOF 619 | } 620 | b := dAtA[iNdEx] 621 | iNdEx++ 622 | m.X |= (int32(b) & 0x7F) << shift 623 | if b < 0x80 { 624 | break 625 | } 626 | } 627 | case 5: 628 | if wireType != 0 { 629 | return fmt.Errorf("proto: wrong wireType = %d for field Y", wireType) 630 | } 631 | m.Y = 0 632 | for shift := uint(0); ; shift += 7 { 633 | if shift >= 64 { 634 | return ErrIntOverflowEnumtype 635 | } 636 | if iNdEx >= l { 637 | return io.ErrUnexpectedEOF 638 | } 639 | b := dAtA[iNdEx] 640 | iNdEx++ 641 | m.Y |= (int32(b) & 0x7F) << shift 642 | if b < 0x80 { 643 | break 644 | } 645 | } 646 | case 6: 647 | if wireType != 0 { 648 | return fmt.Errorf("proto: wrong wireType = %d for field Country", wireType) 649 | } 650 | m.Country = 0 651 | for shift := uint(0); ; shift += 7 { 652 | if shift >= 64 { 653 | return ErrIntOverflowEnumtype 654 | } 655 | if iNdEx >= l { 656 | return io.ErrUnexpectedEOF 657 | } 658 | b := dAtA[iNdEx] 659 | iNdEx++ 660 | m.Country |= (int32(b) & 0x7F) << shift 661 | if b < 0x80 { 662 | break 663 | } 664 | } 665 | case 7: 666 | if wireType != 0 { 667 | return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) 668 | } 669 | m.Level = 0 670 | for shift := uint(0); ; shift += 7 { 671 | if shift >= 64 { 672 | return ErrIntOverflowEnumtype 673 | } 674 | if iNdEx >= l { 675 | return io.ErrUnexpectedEOF 676 | } 677 | b := dAtA[iNdEx] 678 | iNdEx++ 679 | m.Level |= (int32(b) & 0x7F) << shift 680 | if b < 0x80 { 681 | break 682 | } 683 | } 684 | case 8: 685 | if wireType != 0 { 686 | return fmt.Errorf("proto: wrong wireType = %d for field Exp", wireType) 687 | } 688 | m.Exp = 0 689 | for shift := uint(0); ; shift += 7 { 690 | if shift >= 64 { 691 | return ErrIntOverflowEnumtype 692 | } 693 | if iNdEx >= l { 694 | return io.ErrUnexpectedEOF 695 | } 696 | b := dAtA[iNdEx] 697 | iNdEx++ 698 | m.Exp |= (int32(b) & 0x7F) << shift 699 | if b < 0x80 { 700 | break 701 | } 702 | } 703 | case 9: 704 | if wireType != 0 { 705 | return fmt.Errorf("proto: wrong wireType = %d for field Wood", wireType) 706 | } 707 | m.Wood = 0 708 | for shift := uint(0); ; shift += 7 { 709 | if shift >= 64 { 710 | return ErrIntOverflowEnumtype 711 | } 712 | if iNdEx >= l { 713 | return io.ErrUnexpectedEOF 714 | } 715 | b := dAtA[iNdEx] 716 | iNdEx++ 717 | m.Wood |= (int32(b) & 0x7F) << shift 718 | if b < 0x80 { 719 | break 720 | } 721 | } 722 | case 10: 723 | if wireType != 0 { 724 | return fmt.Errorf("proto: wrong wireType = %d for field Iron", wireType) 725 | } 726 | m.Iron = 0 727 | for shift := uint(0); ; shift += 7 { 728 | if shift >= 64 { 729 | return ErrIntOverflowEnumtype 730 | } 731 | if iNdEx >= l { 732 | return io.ErrUnexpectedEOF 733 | } 734 | b := dAtA[iNdEx] 735 | iNdEx++ 736 | m.Iron |= (int32(b) & 0x7F) << shift 737 | if b < 0x80 { 738 | break 739 | } 740 | } 741 | case 11: 742 | if wireType != 0 { 743 | return fmt.Errorf("proto: wrong wireType = %d for field Stone", wireType) 744 | } 745 | m.Stone = 0 746 | for shift := uint(0); ; shift += 7 { 747 | if shift >= 64 { 748 | return ErrIntOverflowEnumtype 749 | } 750 | if iNdEx >= l { 751 | return io.ErrUnexpectedEOF 752 | } 753 | b := dAtA[iNdEx] 754 | iNdEx++ 755 | m.Stone |= (int32(b) & 0x7F) << shift 756 | if b < 0x80 { 757 | break 758 | } 759 | } 760 | case 12: 761 | if wireType != 0 { 762 | return fmt.Errorf("proto: wrong wireType = %d for field Forage", wireType) 763 | } 764 | m.Forage = 0 765 | for shift := uint(0); ; shift += 7 { 766 | if shift >= 64 { 767 | return ErrIntOverflowEnumtype 768 | } 769 | if iNdEx >= l { 770 | return io.ErrUnexpectedEOF 771 | } 772 | b := dAtA[iNdEx] 773 | iNdEx++ 774 | m.Forage |= (int32(b) & 0x7F) << shift 775 | if b < 0x80 { 776 | break 777 | } 778 | } 779 | case 13: 780 | if wireType != 0 { 781 | return fmt.Errorf("proto: wrong wireType = %d for field Gold", wireType) 782 | } 783 | m.Gold = 0 784 | for shift := uint(0); ; shift += 7 { 785 | if shift >= 64 { 786 | return ErrIntOverflowEnumtype 787 | } 788 | if iNdEx >= l { 789 | return io.ErrUnexpectedEOF 790 | } 791 | b := dAtA[iNdEx] 792 | iNdEx++ 793 | m.Gold |= (int32(b) & 0x7F) << shift 794 | if b < 0x80 { 795 | break 796 | } 797 | } 798 | case 14: 799 | if wireType != 0 { 800 | return fmt.Errorf("proto: wrong wireType = %d for field Diamond", wireType) 801 | } 802 | m.Diamond = 0 803 | for shift := uint(0); ; shift += 7 { 804 | if shift >= 64 { 805 | return ErrIntOverflowEnumtype 806 | } 807 | if iNdEx >= l { 808 | return io.ErrUnexpectedEOF 809 | } 810 | b := dAtA[iNdEx] 811 | iNdEx++ 812 | m.Diamond |= (int32(b) & 0x7F) << shift 813 | if b < 0x80 { 814 | break 815 | } 816 | } 817 | case 15: 818 | if wireType != 0 { 819 | return fmt.Errorf("proto: wrong wireType = %d for field BindDiamond", wireType) 820 | } 821 | m.BindDiamond = 0 822 | for shift := uint(0); ; shift += 7 { 823 | if shift >= 64 { 824 | return ErrIntOverflowEnumtype 825 | } 826 | if iNdEx >= l { 827 | return io.ErrUnexpectedEOF 828 | } 829 | b := dAtA[iNdEx] 830 | iNdEx++ 831 | m.BindDiamond |= (int32(b) & 0x7F) << shift 832 | if b < 0x80 { 833 | break 834 | } 835 | } 836 | case 16: 837 | if wireType != 0 { 838 | return fmt.Errorf("proto: wrong wireType = %d for field Decree", wireType) 839 | } 840 | m.Decree = 0 841 | for shift := uint(0); ; shift += 7 { 842 | if shift >= 64 { 843 | return ErrIntOverflowEnumtype 844 | } 845 | if iNdEx >= l { 846 | return io.ErrUnexpectedEOF 847 | } 848 | b := dAtA[iNdEx] 849 | iNdEx++ 850 | m.Decree |= (int32(b) & 0x7F) << shift 851 | if b < 0x80 { 852 | break 853 | } 854 | } 855 | case 17: 856 | if wireType != 0 { 857 | return fmt.Errorf("proto: wrong wireType = %d for field ArmyOrder", wireType) 858 | } 859 | m.ArmyOrder = 0 860 | for shift := uint(0); ; shift += 7 { 861 | if shift >= 64 { 862 | return ErrIntOverflowEnumtype 863 | } 864 | if iNdEx >= l { 865 | return io.ErrUnexpectedEOF 866 | } 867 | b := dAtA[iNdEx] 868 | iNdEx++ 869 | m.ArmyOrder |= (int32(b) & 0x7F) << shift 870 | if b < 0x80 { 871 | break 872 | } 873 | } 874 | case 18: 875 | if wireType != 0 { 876 | return fmt.Errorf("proto: wrong wireType = %d for field Power", wireType) 877 | } 878 | m.Power = 0 879 | for shift := uint(0); ; shift += 7 { 880 | if shift >= 64 { 881 | return ErrIntOverflowEnumtype 882 | } 883 | if iNdEx >= l { 884 | return io.ErrUnexpectedEOF 885 | } 886 | b := dAtA[iNdEx] 887 | iNdEx++ 888 | m.Power |= (int32(b) & 0x7F) << shift 889 | if b < 0x80 { 890 | break 891 | } 892 | } 893 | case 19: 894 | if wireType != 0 { 895 | return fmt.Errorf("proto: wrong wireType = %d for field Domain", wireType) 896 | } 897 | m.Domain = 0 898 | for shift := uint(0); ; shift += 7 { 899 | if shift >= 64 { 900 | return ErrIntOverflowEnumtype 901 | } 902 | if iNdEx >= l { 903 | return io.ErrUnexpectedEOF 904 | } 905 | b := dAtA[iNdEx] 906 | iNdEx++ 907 | m.Domain |= (int32(b) & 0x7F) << shift 908 | if b < 0x80 { 909 | break 910 | } 911 | } 912 | default: 913 | iNdEx = preIndex 914 | skippy, err := skipEnumtype(dAtA[iNdEx:]) 915 | if err != nil { 916 | return err 917 | } 918 | if skippy < 0 { 919 | return ErrInvalidLengthEnumtype 920 | } 921 | if (iNdEx + skippy) > l { 922 | return io.ErrUnexpectedEOF 923 | } 924 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 925 | iNdEx += skippy 926 | } 927 | } 928 | 929 | if iNdEx > l { 930 | return io.ErrUnexpectedEOF 931 | } 932 | return nil 933 | } 934 | func skipEnumtype(dAtA []byte) (n int, err error) { 935 | l := len(dAtA) 936 | iNdEx := 0 937 | for iNdEx < l { 938 | var wire uint64 939 | for shift := uint(0); ; shift += 7 { 940 | if shift >= 64 { 941 | return 0, ErrIntOverflowEnumtype 942 | } 943 | if iNdEx >= l { 944 | return 0, io.ErrUnexpectedEOF 945 | } 946 | b := dAtA[iNdEx] 947 | iNdEx++ 948 | wire |= (uint64(b) & 0x7F) << shift 949 | if b < 0x80 { 950 | break 951 | } 952 | } 953 | wireType := int(wire & 0x7) 954 | switch wireType { 955 | case 0: 956 | for shift := uint(0); ; shift += 7 { 957 | if shift >= 64 { 958 | return 0, ErrIntOverflowEnumtype 959 | } 960 | if iNdEx >= l { 961 | return 0, io.ErrUnexpectedEOF 962 | } 963 | iNdEx++ 964 | if dAtA[iNdEx-1] < 0x80 { 965 | break 966 | } 967 | } 968 | return iNdEx, nil 969 | case 1: 970 | iNdEx += 8 971 | return iNdEx, nil 972 | case 2: 973 | var length int 974 | for shift := uint(0); ; shift += 7 { 975 | if shift >= 64 { 976 | return 0, ErrIntOverflowEnumtype 977 | } 978 | if iNdEx >= l { 979 | return 0, io.ErrUnexpectedEOF 980 | } 981 | b := dAtA[iNdEx] 982 | iNdEx++ 983 | length |= (int(b) & 0x7F) << shift 984 | if b < 0x80 { 985 | break 986 | } 987 | } 988 | iNdEx += length 989 | if length < 0 { 990 | return 0, ErrInvalidLengthEnumtype 991 | } 992 | return iNdEx, nil 993 | case 3: 994 | for { 995 | var innerWire uint64 996 | var start int = iNdEx 997 | for shift := uint(0); ; shift += 7 { 998 | if shift >= 64 { 999 | return 0, ErrIntOverflowEnumtype 1000 | } 1001 | if iNdEx >= l { 1002 | return 0, io.ErrUnexpectedEOF 1003 | } 1004 | b := dAtA[iNdEx] 1005 | iNdEx++ 1006 | innerWire |= (uint64(b) & 0x7F) << shift 1007 | if b < 0x80 { 1008 | break 1009 | } 1010 | } 1011 | innerWireType := int(innerWire & 0x7) 1012 | if innerWireType == 4 { 1013 | break 1014 | } 1015 | next, err := skipEnumtype(dAtA[start:]) 1016 | if err != nil { 1017 | return 0, err 1018 | } 1019 | iNdEx = start + next 1020 | } 1021 | return iNdEx, nil 1022 | case 4: 1023 | return iNdEx, nil 1024 | case 5: 1025 | iNdEx += 4 1026 | return iNdEx, nil 1027 | default: 1028 | return 0, fmt.Errorf("proto: illegal wireType %d", wireType) 1029 | } 1030 | } 1031 | panic("unreachable") 1032 | } 1033 | 1034 | var ( 1035 | ErrInvalidLengthEnumtype = fmt.Errorf("proto: negative length found during unmarshaling") 1036 | ErrIntOverflowEnumtype = fmt.Errorf("proto: integer overflow") 1037 | ) 1038 | 1039 | func init() { proto.RegisterFile("enumtype.proto", fileDescriptor_enumtype_829a9ecd51d5f7be) } 1040 | 1041 | var fileDescriptor_enumtype_829a9ecd51d5f7be = []byte{ 1042 | // 474 bytes of a gzipped FileDescriptorProto 1043 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x92, 0xcb, 0x6e, 0xd3, 0x4c, 1044 | 0x14, 0xc7, 0x33, 0x4d, 0x73, 0xf1, 0xc9, 0xc5, 0x93, 0xf3, 0xa5, 0x1f, 0x23, 0x81, 0xa2, 0x88, 1045 | 0x55, 0xe9, 0x82, 0x0d, 0x4f, 0x90, 0x1b, 0x50, 0xa9, 0x80, 0xe5, 0x2c, 0x68, 0x57, 0xd1, 0x50, 1046 | 0x8f, 0x82, 0xd5, 0x78, 0xc6, 0x8c, 0x6d, 0x4a, 0xde, 0x84, 0xa7, 0xe9, 0x9a, 0x25, 0xf0, 0x04, 1047 | 0x28, 0xac, 0x80, 0x97, 0x40, 0x67, 0xa6, 0x55, 0x23, 0x56, 0xfe, 0xff, 0x7e, 0x63, 0xfd, 0xcf, 1048 | 0xf1, 0x05, 0xfa, 0x4a, 0x57, 0x59, 0xb9, 0xcd, 0xd5, 0xd3, 0xdc, 0x9a, 0xd2, 0x60, 0xc3, 0x5d, 1049 | 0x1e, 0xdf, 0xd4, 0x01, 0xa2, 0x8d, 0xdc, 0x2a, 0x3b, 0x29, 0x4b, 0x8b, 0x0f, 0xa0, 0x55, 0x15, 1050 | 0xca, 0xae, 0xd2, 0x44, 0xb0, 0x31, 0x3b, 0x6e, 0xc4, 0x4d, 0xc2, 0xd3, 0x04, 0x1f, 0x42, 0xa0, 1051 | 0xd3, 0xcb, 0xab, 0x95, 0x96, 0x99, 0x12, 0x07, 0x63, 0x76, 0x1c, 0xc4, 0x6d, 0x12, 0xaf, 0x65, 1052 | 0xa6, 0x10, 0xe1, 0xb0, 0x48, 0xd7, 0x5a, 0xd4, 0x9d, 0x77, 0x19, 0xbb, 0xc0, 0xce, 0xc5, 0xa1, 1053 | 0xeb, 0x60, 0xe7, 0x44, 0x17, 0xa2, 0xe1, 0xe9, 0x02, 0x05, 0xb4, 0x66, 0xa6, 0xd2, 0xa5, 0xdd, 1054 | 0x8a, 0xa6, 0x73, 0x77, 0x88, 0x43, 0x68, 0x9c, 0xa9, 0x8f, 0x6a, 0x23, 0x5a, 0xce, 0x7b, 0x40, 1055 | 0x0e, 0xf5, 0xc5, 0xa7, 0x5c, 0xb4, 0x9d, 0xa3, 0x48, 0x13, 0xdf, 0x1a, 0x93, 0x88, 0xc0, 0x29, 1056 | 0x97, 0xc9, 0x9d, 0x5a, 0xa3, 0x05, 0x78, 0x47, 0x99, 0xfa, 0x96, 0xa5, 0xd1, 0x4a, 0x74, 0x7c, 1057 | 0x9f, 0x03, 0xfc, 0x1f, 0x9a, 0xcf, 0x8d, 0x95, 0x6b, 0x25, 0xba, 0xfe, 0x21, 0x3d, 0x51, 0xc3, 1058 | 0x0b, 0xb3, 0x49, 0x44, 0xcf, 0x37, 0x50, 0xa6, 0x5d, 0xe7, 0xa9, 0xcc, 0x8c, 0x4e, 0x44, 0xdf, 1059 | 0xef, 0x7a, 0x8b, 0x38, 0x86, 0xce, 0x34, 0xd5, 0xc9, 0xdd, 0x69, 0xe8, 0x4e, 0xf7, 0x15, 0xcd, 1060 | 0x99, 0xab, 0x4b, 0xab, 0x94, 0xe0, 0x7e, 0x8e, 0x27, 0x7c, 0x04, 0xc1, 0xc4, 0x66, 0xdb, 0x37, 1061 | 0x36, 0x51, 0x56, 0x0c, 0xdc, 0xd1, 0xbd, 0xa0, 0x9d, 0x23, 0x73, 0xad, 0xac, 0x40, 0xbf, 0xb3, 1062 | 0x03, 0xd7, 0x65, 0x32, 0x99, 0x6a, 0xf1, 0xdf, 0x6d, 0x97, 0xa3, 0x93, 0x1b, 0x06, 0xed, 0x88, 1063 | 0x3e, 0xe5, 0x2c, 0x4b, 0xb0, 0x0b, 0xed, 0xd9, 0xab, 0xf9, 0x2a, 0x9a, 0x2c, 0x97, 0xbc, 0x86, 1064 | 0x21, 0x74, 0x88, 0x16, 0xd6, 0xc6, 0xaa, 0xc8, 0x39, 0xc3, 0x21, 0x70, 0x12, 0x2f, 0x95, 0xb4, 1065 | 0xe5, 0x54, 0xc9, 0x32, 0x56, 0x1f, 0xf8, 0x01, 0x1e, 0xc1, 0xe0, 0x1f, 0x5b, 0xe4, 0xbc, 0x8e, 1066 | 0x03, 0xe8, 0x92, 0x3e, 0x33, 0xeb, 0x54, 0xd3, 0x8d, 0xbf, 0x5a, 0x88, 0xd0, 0xdb, 0x53, 0x45, 1067 | 0xce, 0x7f, 0xef, 0x3b, 0x53, 0xb9, 0xc2, 0x3f, 0x2d, 0x1c, 0x42, 0x48, 0x6e, 0xf9, 0xde, 0x5c, 1068 | 0xc7, 0x52, 0x5f, 0x91, 0xfd, 0x16, 0xe2, 0x91, 0x9f, 0x7e, 0x6f, 0x8b, 0x9c, 0x7f, 0x0f, 0x4f, 1069 | 0x9e, 0x40, 0x9b, 0x70, 0xa1, 0xab, 0x0c, 0x7b, 0x10, 0x50, 0x5e, 0x45, 0xb2, 0x28, 0x78, 0x0d, 1070 | 0xfb, 0x00, 0x1e, 0xe9, 0x0d, 0x70, 0x36, 0xe5, 0x5f, 0x76, 0x23, 0xf6, 0x75, 0x37, 0x62, 0x3f, 1071 | 0x76, 0x23, 0xf6, 0xf9, 0xe7, 0xa8, 0xf6, 0xae, 0xe9, 0xfe, 0xe2, 0x67, 0x7f, 0x03, 0x00, 0x00, 1072 | 0xff, 0xff, 0xc5, 0x84, 0xb8, 0x96, 0xde, 0x02, 0x00, 0x00, 1073 | } 1074 | -------------------------------------------------------------------------------- /proto/enumtype.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto; 4 | 5 | enum ProtoCmd { 6 | CMD_PASS = 0; 7 | CMD_ErrResp = 1; 8 | CMD_HeartBeatReq = 2; 9 | CMD_HeartBeatResp = 3; 10 | CMD_LoginReq = 1001; 11 | CMD_LoginResp = 1002; 12 | CMD_LogoutReq = 1003; 13 | 14 | CMD_ShowRankReq = 2001; 15 | CMD_ShowRankResp = 2002; 16 | 17 | } 18 | 19 | enum RankEnum { 20 | Rank_Pass = 0; 21 | Rank_Power = 1; 22 | } 23 | 24 | message PlayerAttr { 25 | int32 user_id = 1; // userID 26 | string nick_name = 2; // 昵称 27 | string sign = 3; // 签名 28 | int32 X = 4; // X坐标 29 | int32 Y = 5; // Y坐标 30 | int32 Country = 6; // 玩家所属国家 31 | int32 Level = 7; // 等级 32 | int32 Exp = 8; // 经验值 33 | int32 Wood = 9; // 木材 34 | int32 Iron = 10; // 铁矿 35 | int32 Stone = 11; // 石料 36 | int32 Forage = 12; // 粮草 37 | int32 Gold = 13; // 金币 38 | int32 Diamond = 14; // 钻石 39 | int32 BindDiamond = 15; // 绑定钻石 40 | int32 Decree = 16; // 政令 41 | int32 ArmyOrder = 17; // 军令 42 | int32 Power = 18; // 势力值 43 | int32 Domain = 19; // 领地个数 44 | 45 | } 46 | -------------------------------------------------------------------------------- /proto/export.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #protoc --go_out=. *.proto 3 | 4 | #protoc --gogo_out=. *.proto 5 | 6 | #protoc --proto_path =. *.proto --gofast_out=. 7 | 8 | protoc --gofast_out=. *.proto -------------------------------------------------------------------------------- /proto/login.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-gogo. DO NOT EDIT. 2 | // source: login.proto 3 | 4 | package proto 5 | 6 | import proto "github.com/golang/protobuf/proto" 7 | import fmt "fmt" 8 | import math "math" 9 | 10 | import io "io" 11 | 12 | // Reference imports to suppress errors if they are not otherwise used. 13 | var _ = proto.Marshal 14 | var _ = fmt.Errorf 15 | var _ = math.Inf 16 | 17 | // This is a compile-time assertion to ensure that this generated file 18 | // is compatible with the proto package it is being compiled against. 19 | // A compilation error at this line likely means your copy of the 20 | // proto package needs to be updated. 21 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 22 | 23 | // 登录请求 24 | type LoginReq struct { 25 | AcctName string `protobuf:"bytes,1,opt,name=acct_name,json=acctName,proto3" json:"acct_name,omitempty"` 26 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 27 | XXX_unrecognized []byte `json:"-"` 28 | XXX_sizecache int32 `json:"-"` 29 | } 30 | 31 | func (m *LoginReq) Reset() { *m = LoginReq{} } 32 | func (m *LoginReq) String() string { return proto.CompactTextString(m) } 33 | func (*LoginReq) ProtoMessage() {} 34 | func (*LoginReq) Descriptor() ([]byte, []int) { 35 | return fileDescriptor_login_dd3eb7502fe598e6, []int{0} 36 | } 37 | func (m *LoginReq) XXX_Unmarshal(b []byte) error { 38 | return m.Unmarshal(b) 39 | } 40 | func (m *LoginReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 41 | if deterministic { 42 | return xxx_messageInfo_LoginReq.Marshal(b, m, deterministic) 43 | } else { 44 | b = b[:cap(b)] 45 | n, err := m.MarshalTo(b) 46 | if err != nil { 47 | return nil, err 48 | } 49 | return b[:n], nil 50 | } 51 | } 52 | func (dst *LoginReq) XXX_Merge(src proto.Message) { 53 | xxx_messageInfo_LoginReq.Merge(dst, src) 54 | } 55 | func (m *LoginReq) XXX_Size() int { 56 | return m.Size() 57 | } 58 | func (m *LoginReq) XXX_DiscardUnknown() { 59 | xxx_messageInfo_LoginReq.DiscardUnknown(m) 60 | } 61 | 62 | var xxx_messageInfo_LoginReq proto.InternalMessageInfo 63 | 64 | func (m *LoginReq) GetAcctName() string { 65 | if m != nil { 66 | return m.AcctName 67 | } 68 | return "" 69 | } 70 | 71 | // 登录响应 72 | type LoginResp struct { 73 | PlayerAttr *PlayerAttr `protobuf:"bytes,1,opt,name=player_attr,json=playerAttr" json:"player_attr,omitempty"` 74 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 75 | XXX_unrecognized []byte `json:"-"` 76 | XXX_sizecache int32 `json:"-"` 77 | } 78 | 79 | func (m *LoginResp) Reset() { *m = LoginResp{} } 80 | func (m *LoginResp) String() string { return proto.CompactTextString(m) } 81 | func (*LoginResp) ProtoMessage() {} 82 | func (*LoginResp) Descriptor() ([]byte, []int) { 83 | return fileDescriptor_login_dd3eb7502fe598e6, []int{1} 84 | } 85 | func (m *LoginResp) XXX_Unmarshal(b []byte) error { 86 | return m.Unmarshal(b) 87 | } 88 | func (m *LoginResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 89 | if deterministic { 90 | return xxx_messageInfo_LoginResp.Marshal(b, m, deterministic) 91 | } else { 92 | b = b[:cap(b)] 93 | n, err := m.MarshalTo(b) 94 | if err != nil { 95 | return nil, err 96 | } 97 | return b[:n], nil 98 | } 99 | } 100 | func (dst *LoginResp) XXX_Merge(src proto.Message) { 101 | xxx_messageInfo_LoginResp.Merge(dst, src) 102 | } 103 | func (m *LoginResp) XXX_Size() int { 104 | return m.Size() 105 | } 106 | func (m *LoginResp) XXX_DiscardUnknown() { 107 | xxx_messageInfo_LoginResp.DiscardUnknown(m) 108 | } 109 | 110 | var xxx_messageInfo_LoginResp proto.InternalMessageInfo 111 | 112 | func (m *LoginResp) GetPlayerAttr() *PlayerAttr { 113 | if m != nil { 114 | return m.PlayerAttr 115 | } 116 | return nil 117 | } 118 | 119 | // 退出请求 120 | type LogOutReq struct { 121 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 122 | XXX_unrecognized []byte `json:"-"` 123 | XXX_sizecache int32 `json:"-"` 124 | } 125 | 126 | func (m *LogOutReq) Reset() { *m = LogOutReq{} } 127 | func (m *LogOutReq) String() string { return proto.CompactTextString(m) } 128 | func (*LogOutReq) ProtoMessage() {} 129 | func (*LogOutReq) Descriptor() ([]byte, []int) { 130 | return fileDescriptor_login_dd3eb7502fe598e6, []int{2} 131 | } 132 | func (m *LogOutReq) XXX_Unmarshal(b []byte) error { 133 | return m.Unmarshal(b) 134 | } 135 | func (m *LogOutReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 136 | if deterministic { 137 | return xxx_messageInfo_LogOutReq.Marshal(b, m, deterministic) 138 | } else { 139 | b = b[:cap(b)] 140 | n, err := m.MarshalTo(b) 141 | if err != nil { 142 | return nil, err 143 | } 144 | return b[:n], nil 145 | } 146 | } 147 | func (dst *LogOutReq) XXX_Merge(src proto.Message) { 148 | xxx_messageInfo_LogOutReq.Merge(dst, src) 149 | } 150 | func (m *LogOutReq) XXX_Size() int { 151 | return m.Size() 152 | } 153 | func (m *LogOutReq) XXX_DiscardUnknown() { 154 | xxx_messageInfo_LogOutReq.DiscardUnknown(m) 155 | } 156 | 157 | var xxx_messageInfo_LogOutReq proto.InternalMessageInfo 158 | 159 | func init() { 160 | proto.RegisterType((*LoginReq)(nil), "proto.LoginReq") 161 | proto.RegisterType((*LoginResp)(nil), "proto.LoginResp") 162 | proto.RegisterType((*LogOutReq)(nil), "proto.LogOutReq") 163 | } 164 | func (m *LoginReq) Marshal() (dAtA []byte, err error) { 165 | size := m.Size() 166 | dAtA = make([]byte, size) 167 | n, err := m.MarshalTo(dAtA) 168 | if err != nil { 169 | return nil, err 170 | } 171 | return dAtA[:n], nil 172 | } 173 | 174 | func (m *LoginReq) MarshalTo(dAtA []byte) (int, error) { 175 | var i int 176 | _ = i 177 | var l int 178 | _ = l 179 | if len(m.AcctName) > 0 { 180 | dAtA[i] = 0xa 181 | i++ 182 | i = encodeVarintLogin(dAtA, i, uint64(len(m.AcctName))) 183 | i += copy(dAtA[i:], m.AcctName) 184 | } 185 | if m.XXX_unrecognized != nil { 186 | i += copy(dAtA[i:], m.XXX_unrecognized) 187 | } 188 | return i, nil 189 | } 190 | 191 | func (m *LoginResp) Marshal() (dAtA []byte, err error) { 192 | size := m.Size() 193 | dAtA = make([]byte, size) 194 | n, err := m.MarshalTo(dAtA) 195 | if err != nil { 196 | return nil, err 197 | } 198 | return dAtA[:n], nil 199 | } 200 | 201 | func (m *LoginResp) MarshalTo(dAtA []byte) (int, error) { 202 | var i int 203 | _ = i 204 | var l int 205 | _ = l 206 | if m.PlayerAttr != nil { 207 | dAtA[i] = 0xa 208 | i++ 209 | i = encodeVarintLogin(dAtA, i, uint64(m.PlayerAttr.Size())) 210 | n1, err := m.PlayerAttr.MarshalTo(dAtA[i:]) 211 | if err != nil { 212 | return 0, err 213 | } 214 | i += n1 215 | } 216 | if m.XXX_unrecognized != nil { 217 | i += copy(dAtA[i:], m.XXX_unrecognized) 218 | } 219 | return i, nil 220 | } 221 | 222 | func (m *LogOutReq) Marshal() (dAtA []byte, err error) { 223 | size := m.Size() 224 | dAtA = make([]byte, size) 225 | n, err := m.MarshalTo(dAtA) 226 | if err != nil { 227 | return nil, err 228 | } 229 | return dAtA[:n], nil 230 | } 231 | 232 | func (m *LogOutReq) MarshalTo(dAtA []byte) (int, error) { 233 | var i int 234 | _ = i 235 | var l int 236 | _ = l 237 | if m.XXX_unrecognized != nil { 238 | i += copy(dAtA[i:], m.XXX_unrecognized) 239 | } 240 | return i, nil 241 | } 242 | 243 | func encodeVarintLogin(dAtA []byte, offset int, v uint64) int { 244 | for v >= 1<<7 { 245 | dAtA[offset] = uint8(v&0x7f | 0x80) 246 | v >>= 7 247 | offset++ 248 | } 249 | dAtA[offset] = uint8(v) 250 | return offset + 1 251 | } 252 | func (m *LoginReq) Size() (n int) { 253 | var l int 254 | _ = l 255 | l = len(m.AcctName) 256 | if l > 0 { 257 | n += 1 + l + sovLogin(uint64(l)) 258 | } 259 | if m.XXX_unrecognized != nil { 260 | n += len(m.XXX_unrecognized) 261 | } 262 | return n 263 | } 264 | 265 | func (m *LoginResp) Size() (n int) { 266 | var l int 267 | _ = l 268 | if m.PlayerAttr != nil { 269 | l = m.PlayerAttr.Size() 270 | n += 1 + l + sovLogin(uint64(l)) 271 | } 272 | if m.XXX_unrecognized != nil { 273 | n += len(m.XXX_unrecognized) 274 | } 275 | return n 276 | } 277 | 278 | func (m *LogOutReq) Size() (n int) { 279 | var l int 280 | _ = l 281 | if m.XXX_unrecognized != nil { 282 | n += len(m.XXX_unrecognized) 283 | } 284 | return n 285 | } 286 | 287 | func sovLogin(x uint64) (n int) { 288 | for { 289 | n++ 290 | x >>= 7 291 | if x == 0 { 292 | break 293 | } 294 | } 295 | return n 296 | } 297 | func sozLogin(x uint64) (n int) { 298 | return sovLogin(uint64((x << 1) ^ uint64((int64(x) >> 63)))) 299 | } 300 | func (m *LoginReq) Unmarshal(dAtA []byte) error { 301 | l := len(dAtA) 302 | iNdEx := 0 303 | for iNdEx < l { 304 | preIndex := iNdEx 305 | var wire uint64 306 | for shift := uint(0); ; shift += 7 { 307 | if shift >= 64 { 308 | return ErrIntOverflowLogin 309 | } 310 | if iNdEx >= l { 311 | return io.ErrUnexpectedEOF 312 | } 313 | b := dAtA[iNdEx] 314 | iNdEx++ 315 | wire |= (uint64(b) & 0x7F) << shift 316 | if b < 0x80 { 317 | break 318 | } 319 | } 320 | fieldNum := int32(wire >> 3) 321 | wireType := int(wire & 0x7) 322 | if wireType == 4 { 323 | return fmt.Errorf("proto: LoginReq: wiretype end group for non-group") 324 | } 325 | if fieldNum <= 0 { 326 | return fmt.Errorf("proto: LoginReq: illegal tag %d (wire type %d)", fieldNum, wire) 327 | } 328 | switch fieldNum { 329 | case 1: 330 | if wireType != 2 { 331 | return fmt.Errorf("proto: wrong wireType = %d for field AcctName", wireType) 332 | } 333 | var stringLen uint64 334 | for shift := uint(0); ; shift += 7 { 335 | if shift >= 64 { 336 | return ErrIntOverflowLogin 337 | } 338 | if iNdEx >= l { 339 | return io.ErrUnexpectedEOF 340 | } 341 | b := dAtA[iNdEx] 342 | iNdEx++ 343 | stringLen |= (uint64(b) & 0x7F) << shift 344 | if b < 0x80 { 345 | break 346 | } 347 | } 348 | intStringLen := int(stringLen) 349 | if intStringLen < 0 { 350 | return ErrInvalidLengthLogin 351 | } 352 | postIndex := iNdEx + intStringLen 353 | if postIndex > l { 354 | return io.ErrUnexpectedEOF 355 | } 356 | m.AcctName = string(dAtA[iNdEx:postIndex]) 357 | iNdEx = postIndex 358 | default: 359 | iNdEx = preIndex 360 | skippy, err := skipLogin(dAtA[iNdEx:]) 361 | if err != nil { 362 | return err 363 | } 364 | if skippy < 0 { 365 | return ErrInvalidLengthLogin 366 | } 367 | if (iNdEx + skippy) > l { 368 | return io.ErrUnexpectedEOF 369 | } 370 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 371 | iNdEx += skippy 372 | } 373 | } 374 | 375 | if iNdEx > l { 376 | return io.ErrUnexpectedEOF 377 | } 378 | return nil 379 | } 380 | func (m *LoginResp) Unmarshal(dAtA []byte) error { 381 | l := len(dAtA) 382 | iNdEx := 0 383 | for iNdEx < l { 384 | preIndex := iNdEx 385 | var wire uint64 386 | for shift := uint(0); ; shift += 7 { 387 | if shift >= 64 { 388 | return ErrIntOverflowLogin 389 | } 390 | if iNdEx >= l { 391 | return io.ErrUnexpectedEOF 392 | } 393 | b := dAtA[iNdEx] 394 | iNdEx++ 395 | wire |= (uint64(b) & 0x7F) << shift 396 | if b < 0x80 { 397 | break 398 | } 399 | } 400 | fieldNum := int32(wire >> 3) 401 | wireType := int(wire & 0x7) 402 | if wireType == 4 { 403 | return fmt.Errorf("proto: LoginResp: wiretype end group for non-group") 404 | } 405 | if fieldNum <= 0 { 406 | return fmt.Errorf("proto: LoginResp: illegal tag %d (wire type %d)", fieldNum, wire) 407 | } 408 | switch fieldNum { 409 | case 1: 410 | if wireType != 2 { 411 | return fmt.Errorf("proto: wrong wireType = %d for field PlayerAttr", wireType) 412 | } 413 | var msglen int 414 | for shift := uint(0); ; shift += 7 { 415 | if shift >= 64 { 416 | return ErrIntOverflowLogin 417 | } 418 | if iNdEx >= l { 419 | return io.ErrUnexpectedEOF 420 | } 421 | b := dAtA[iNdEx] 422 | iNdEx++ 423 | msglen |= (int(b) & 0x7F) << shift 424 | if b < 0x80 { 425 | break 426 | } 427 | } 428 | if msglen < 0 { 429 | return ErrInvalidLengthLogin 430 | } 431 | postIndex := iNdEx + msglen 432 | if postIndex > l { 433 | return io.ErrUnexpectedEOF 434 | } 435 | if m.PlayerAttr == nil { 436 | m.PlayerAttr = &PlayerAttr{} 437 | } 438 | if err := m.PlayerAttr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { 439 | return err 440 | } 441 | iNdEx = postIndex 442 | default: 443 | iNdEx = preIndex 444 | skippy, err := skipLogin(dAtA[iNdEx:]) 445 | if err != nil { 446 | return err 447 | } 448 | if skippy < 0 { 449 | return ErrInvalidLengthLogin 450 | } 451 | if (iNdEx + skippy) > l { 452 | return io.ErrUnexpectedEOF 453 | } 454 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 455 | iNdEx += skippy 456 | } 457 | } 458 | 459 | if iNdEx > l { 460 | return io.ErrUnexpectedEOF 461 | } 462 | return nil 463 | } 464 | func (m *LogOutReq) Unmarshal(dAtA []byte) error { 465 | l := len(dAtA) 466 | iNdEx := 0 467 | for iNdEx < l { 468 | preIndex := iNdEx 469 | var wire uint64 470 | for shift := uint(0); ; shift += 7 { 471 | if shift >= 64 { 472 | return ErrIntOverflowLogin 473 | } 474 | if iNdEx >= l { 475 | return io.ErrUnexpectedEOF 476 | } 477 | b := dAtA[iNdEx] 478 | iNdEx++ 479 | wire |= (uint64(b) & 0x7F) << shift 480 | if b < 0x80 { 481 | break 482 | } 483 | } 484 | fieldNum := int32(wire >> 3) 485 | wireType := int(wire & 0x7) 486 | if wireType == 4 { 487 | return fmt.Errorf("proto: LogOutReq: wiretype end group for non-group") 488 | } 489 | if fieldNum <= 0 { 490 | return fmt.Errorf("proto: LogOutReq: illegal tag %d (wire type %d)", fieldNum, wire) 491 | } 492 | switch fieldNum { 493 | default: 494 | iNdEx = preIndex 495 | skippy, err := skipLogin(dAtA[iNdEx:]) 496 | if err != nil { 497 | return err 498 | } 499 | if skippy < 0 { 500 | return ErrInvalidLengthLogin 501 | } 502 | if (iNdEx + skippy) > l { 503 | return io.ErrUnexpectedEOF 504 | } 505 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 506 | iNdEx += skippy 507 | } 508 | } 509 | 510 | if iNdEx > l { 511 | return io.ErrUnexpectedEOF 512 | } 513 | return nil 514 | } 515 | func skipLogin(dAtA []byte) (n int, err error) { 516 | l := len(dAtA) 517 | iNdEx := 0 518 | for iNdEx < l { 519 | var wire uint64 520 | for shift := uint(0); ; shift += 7 { 521 | if shift >= 64 { 522 | return 0, ErrIntOverflowLogin 523 | } 524 | if iNdEx >= l { 525 | return 0, io.ErrUnexpectedEOF 526 | } 527 | b := dAtA[iNdEx] 528 | iNdEx++ 529 | wire |= (uint64(b) & 0x7F) << shift 530 | if b < 0x80 { 531 | break 532 | } 533 | } 534 | wireType := int(wire & 0x7) 535 | switch wireType { 536 | case 0: 537 | for shift := uint(0); ; shift += 7 { 538 | if shift >= 64 { 539 | return 0, ErrIntOverflowLogin 540 | } 541 | if iNdEx >= l { 542 | return 0, io.ErrUnexpectedEOF 543 | } 544 | iNdEx++ 545 | if dAtA[iNdEx-1] < 0x80 { 546 | break 547 | } 548 | } 549 | return iNdEx, nil 550 | case 1: 551 | iNdEx += 8 552 | return iNdEx, nil 553 | case 2: 554 | var length int 555 | for shift := uint(0); ; shift += 7 { 556 | if shift >= 64 { 557 | return 0, ErrIntOverflowLogin 558 | } 559 | if iNdEx >= l { 560 | return 0, io.ErrUnexpectedEOF 561 | } 562 | b := dAtA[iNdEx] 563 | iNdEx++ 564 | length |= (int(b) & 0x7F) << shift 565 | if b < 0x80 { 566 | break 567 | } 568 | } 569 | iNdEx += length 570 | if length < 0 { 571 | return 0, ErrInvalidLengthLogin 572 | } 573 | return iNdEx, nil 574 | case 3: 575 | for { 576 | var innerWire uint64 577 | var start int = iNdEx 578 | for shift := uint(0); ; shift += 7 { 579 | if shift >= 64 { 580 | return 0, ErrIntOverflowLogin 581 | } 582 | if iNdEx >= l { 583 | return 0, io.ErrUnexpectedEOF 584 | } 585 | b := dAtA[iNdEx] 586 | iNdEx++ 587 | innerWire |= (uint64(b) & 0x7F) << shift 588 | if b < 0x80 { 589 | break 590 | } 591 | } 592 | innerWireType := int(innerWire & 0x7) 593 | if innerWireType == 4 { 594 | break 595 | } 596 | next, err := skipLogin(dAtA[start:]) 597 | if err != nil { 598 | return 0, err 599 | } 600 | iNdEx = start + next 601 | } 602 | return iNdEx, nil 603 | case 4: 604 | return iNdEx, nil 605 | case 5: 606 | iNdEx += 4 607 | return iNdEx, nil 608 | default: 609 | return 0, fmt.Errorf("proto: illegal wireType %d", wireType) 610 | } 611 | } 612 | panic("unreachable") 613 | } 614 | 615 | var ( 616 | ErrInvalidLengthLogin = fmt.Errorf("proto: negative length found during unmarshaling") 617 | ErrIntOverflowLogin = fmt.Errorf("proto: integer overflow") 618 | ) 619 | 620 | func init() { proto.RegisterFile("login.proto", fileDescriptor_login_dd3eb7502fe598e6) } 621 | 622 | var fileDescriptor_login_dd3eb7502fe598e6 = []byte{ 623 | // 166 bytes of a gzipped FileDescriptorProto 624 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xce, 0xc9, 0x4f, 0xcf, 625 | 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x05, 0x53, 0x52, 0x7c, 0xa9, 0x79, 0xa5, 626 | 0xb9, 0x25, 0x95, 0x05, 0xa9, 0x10, 0x61, 0x25, 0x75, 0x2e, 0x0e, 0x1f, 0x90, 0xaa, 0xa0, 0xd4, 627 | 0x42, 0x21, 0x69, 0x2e, 0xce, 0xc4, 0xe4, 0xe4, 0x92, 0xf8, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x46, 628 | 0x05, 0x46, 0x0d, 0xce, 0x20, 0x0e, 0x90, 0x80, 0x5f, 0x62, 0x6e, 0xaa, 0x92, 0x3d, 0x17, 0x27, 629 | 0x54, 0x61, 0x71, 0x81, 0x90, 0x11, 0x17, 0x77, 0x41, 0x4e, 0x62, 0x65, 0x6a, 0x51, 0x7c, 0x62, 630 | 0x49, 0x49, 0x11, 0x58, 0x2d, 0xb7, 0x91, 0x20, 0xc4, 0x48, 0xbd, 0x00, 0xb0, 0x8c, 0x63, 0x49, 631 | 0x49, 0x51, 0x10, 0x57, 0x01, 0x9c, 0xad, 0xc4, 0x0d, 0x36, 0xc0, 0xbf, 0xb4, 0x24, 0x28, 0xb5, 632 | 0xd0, 0x49, 0xe0, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 633 | 0xf1, 0x58, 0x8e, 0x21, 0x89, 0x0d, 0xac, 0xd9, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x1e, 0x54, 634 | 0xd3, 0x69, 0xb5, 0x00, 0x00, 0x00, 635 | } 636 | -------------------------------------------------------------------------------- /proto/login.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | import "enumtype.proto"; 4 | 5 | package proto; 6 | 7 | // 登录请求 8 | message LoginReq { 9 | string acct_name = 1; // 账号名 10 | } 11 | 12 | // 登录响应 13 | message LoginResp { 14 | PlayerAttr player_attr = 1; // 玩家属性 15 | } 16 | 17 | // 退出请求 18 | message LogOutReq {} 19 | -------------------------------------------------------------------------------- /proto/rank.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-gogo. DO NOT EDIT. 2 | // source: rank.proto 3 | 4 | package proto 5 | 6 | import proto "github.com/golang/protobuf/proto" 7 | import fmt "fmt" 8 | import math "math" 9 | 10 | import io "io" 11 | 12 | // Reference imports to suppress errors if they are not otherwise used. 13 | var _ = proto.Marshal 14 | var _ = fmt.Errorf 15 | var _ = math.Inf 16 | 17 | // This is a compile-time assertion to ensure that this generated file 18 | // is compatible with the proto package it is being compiled against. 19 | // A compilation error at this line likely means your copy of the 20 | // proto package needs to be updated. 21 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 22 | 23 | // 查看排行榜 24 | type ShowRankReq struct { 25 | Key RankEnum `protobuf:"varint,1,opt,name=key,proto3,enum=proto.RankEnum" json:"key,omitempty"` 26 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 27 | XXX_unrecognized []byte `json:"-"` 28 | XXX_sizecache int32 `json:"-"` 29 | } 30 | 31 | func (m *ShowRankReq) Reset() { *m = ShowRankReq{} } 32 | func (m *ShowRankReq) String() string { return proto.CompactTextString(m) } 33 | func (*ShowRankReq) ProtoMessage() {} 34 | func (*ShowRankReq) Descriptor() ([]byte, []int) { 35 | return fileDescriptor_rank_e9617fcee290bf2c, []int{0} 36 | } 37 | func (m *ShowRankReq) XXX_Unmarshal(b []byte) error { 38 | return m.Unmarshal(b) 39 | } 40 | func (m *ShowRankReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 41 | if deterministic { 42 | return xxx_messageInfo_ShowRankReq.Marshal(b, m, deterministic) 43 | } else { 44 | b = b[:cap(b)] 45 | n, err := m.MarshalTo(b) 46 | if err != nil { 47 | return nil, err 48 | } 49 | return b[:n], nil 50 | } 51 | } 52 | func (dst *ShowRankReq) XXX_Merge(src proto.Message) { 53 | xxx_messageInfo_ShowRankReq.Merge(dst, src) 54 | } 55 | func (m *ShowRankReq) XXX_Size() int { 56 | return m.Size() 57 | } 58 | func (m *ShowRankReq) XXX_DiscardUnknown() { 59 | xxx_messageInfo_ShowRankReq.DiscardUnknown(m) 60 | } 61 | 62 | var xxx_messageInfo_ShowRankReq proto.InternalMessageInfo 63 | 64 | func (m *ShowRankReq) GetKey() RankEnum { 65 | if m != nil { 66 | return m.Key 67 | } 68 | return RankEnum_Rank_Pass 69 | } 70 | 71 | // 登录响应 72 | type ShowRankResp struct { 73 | MyRank int32 `protobuf:"varint,1,opt,name=my_rank,json=myRank,proto3" json:"my_rank,omitempty"` 74 | NickName string `protobuf:"bytes,2,opt,name=nick_name,json=nickName,proto3" json:"nick_name,omitempty"` 75 | RankObj []*Rank `protobuf:"bytes,3,rep,name=rank_obj,json=rankObj" json:"rank_obj,omitempty"` 76 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 77 | XXX_unrecognized []byte `json:"-"` 78 | XXX_sizecache int32 `json:"-"` 79 | } 80 | 81 | func (m *ShowRankResp) Reset() { *m = ShowRankResp{} } 82 | func (m *ShowRankResp) String() string { return proto.CompactTextString(m) } 83 | func (*ShowRankResp) ProtoMessage() {} 84 | func (*ShowRankResp) Descriptor() ([]byte, []int) { 85 | return fileDescriptor_rank_e9617fcee290bf2c, []int{1} 86 | } 87 | func (m *ShowRankResp) XXX_Unmarshal(b []byte) error { 88 | return m.Unmarshal(b) 89 | } 90 | func (m *ShowRankResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 91 | if deterministic { 92 | return xxx_messageInfo_ShowRankResp.Marshal(b, m, deterministic) 93 | } else { 94 | b = b[:cap(b)] 95 | n, err := m.MarshalTo(b) 96 | if err != nil { 97 | return nil, err 98 | } 99 | return b[:n], nil 100 | } 101 | } 102 | func (dst *ShowRankResp) XXX_Merge(src proto.Message) { 103 | xxx_messageInfo_ShowRankResp.Merge(dst, src) 104 | } 105 | func (m *ShowRankResp) XXX_Size() int { 106 | return m.Size() 107 | } 108 | func (m *ShowRankResp) XXX_DiscardUnknown() { 109 | xxx_messageInfo_ShowRankResp.DiscardUnknown(m) 110 | } 111 | 112 | var xxx_messageInfo_ShowRankResp proto.InternalMessageInfo 113 | 114 | func (m *ShowRankResp) GetMyRank() int32 { 115 | if m != nil { 116 | return m.MyRank 117 | } 118 | return 0 119 | } 120 | 121 | func (m *ShowRankResp) GetNickName() string { 122 | if m != nil { 123 | return m.NickName 124 | } 125 | return "" 126 | } 127 | 128 | func (m *ShowRankResp) GetRankObj() []*Rank { 129 | if m != nil { 130 | return m.RankObj 131 | } 132 | return nil 133 | } 134 | 135 | type Rank struct { 136 | RankNum int32 `protobuf:"varint,1,opt,name=rank_num,json=rankNum,proto3" json:"rank_num,omitempty"` 137 | PlayerAttr *PlayerAttr `protobuf:"bytes,3,opt,name=player_attr,json=playerAttr" json:"player_attr,omitempty"` 138 | XXX_NoUnkeyedLiteral struct{} `json:"-"` 139 | XXX_unrecognized []byte `json:"-"` 140 | XXX_sizecache int32 `json:"-"` 141 | } 142 | 143 | func (m *Rank) Reset() { *m = Rank{} } 144 | func (m *Rank) String() string { return proto.CompactTextString(m) } 145 | func (*Rank) ProtoMessage() {} 146 | func (*Rank) Descriptor() ([]byte, []int) { 147 | return fileDescriptor_rank_e9617fcee290bf2c, []int{2} 148 | } 149 | func (m *Rank) XXX_Unmarshal(b []byte) error { 150 | return m.Unmarshal(b) 151 | } 152 | func (m *Rank) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 153 | if deterministic { 154 | return xxx_messageInfo_Rank.Marshal(b, m, deterministic) 155 | } else { 156 | b = b[:cap(b)] 157 | n, err := m.MarshalTo(b) 158 | if err != nil { 159 | return nil, err 160 | } 161 | return b[:n], nil 162 | } 163 | } 164 | func (dst *Rank) XXX_Merge(src proto.Message) { 165 | xxx_messageInfo_Rank.Merge(dst, src) 166 | } 167 | func (m *Rank) XXX_Size() int { 168 | return m.Size() 169 | } 170 | func (m *Rank) XXX_DiscardUnknown() { 171 | xxx_messageInfo_Rank.DiscardUnknown(m) 172 | } 173 | 174 | var xxx_messageInfo_Rank proto.InternalMessageInfo 175 | 176 | func (m *Rank) GetRankNum() int32 { 177 | if m != nil { 178 | return m.RankNum 179 | } 180 | return 0 181 | } 182 | 183 | func (m *Rank) GetPlayerAttr() *PlayerAttr { 184 | if m != nil { 185 | return m.PlayerAttr 186 | } 187 | return nil 188 | } 189 | 190 | func init() { 191 | proto.RegisterType((*ShowRankReq)(nil), "proto.ShowRankReq") 192 | proto.RegisterType((*ShowRankResp)(nil), "proto.ShowRankResp") 193 | proto.RegisterType((*Rank)(nil), "proto.Rank") 194 | } 195 | func (m *ShowRankReq) Marshal() (dAtA []byte, err error) { 196 | size := m.Size() 197 | dAtA = make([]byte, size) 198 | n, err := m.MarshalTo(dAtA) 199 | if err != nil { 200 | return nil, err 201 | } 202 | return dAtA[:n], nil 203 | } 204 | 205 | func (m *ShowRankReq) MarshalTo(dAtA []byte) (int, error) { 206 | var i int 207 | _ = i 208 | var l int 209 | _ = l 210 | if m.Key != 0 { 211 | dAtA[i] = 0x8 212 | i++ 213 | i = encodeVarintRank(dAtA, i, uint64(m.Key)) 214 | } 215 | if m.XXX_unrecognized != nil { 216 | i += copy(dAtA[i:], m.XXX_unrecognized) 217 | } 218 | return i, nil 219 | } 220 | 221 | func (m *ShowRankResp) Marshal() (dAtA []byte, err error) { 222 | size := m.Size() 223 | dAtA = make([]byte, size) 224 | n, err := m.MarshalTo(dAtA) 225 | if err != nil { 226 | return nil, err 227 | } 228 | return dAtA[:n], nil 229 | } 230 | 231 | func (m *ShowRankResp) MarshalTo(dAtA []byte) (int, error) { 232 | var i int 233 | _ = i 234 | var l int 235 | _ = l 236 | if m.MyRank != 0 { 237 | dAtA[i] = 0x8 238 | i++ 239 | i = encodeVarintRank(dAtA, i, uint64(m.MyRank)) 240 | } 241 | if len(m.NickName) > 0 { 242 | dAtA[i] = 0x12 243 | i++ 244 | i = encodeVarintRank(dAtA, i, uint64(len(m.NickName))) 245 | i += copy(dAtA[i:], m.NickName) 246 | } 247 | if len(m.RankObj) > 0 { 248 | for _, msg := range m.RankObj { 249 | dAtA[i] = 0x1a 250 | i++ 251 | i = encodeVarintRank(dAtA, i, uint64(msg.Size())) 252 | n, err := msg.MarshalTo(dAtA[i:]) 253 | if err != nil { 254 | return 0, err 255 | } 256 | i += n 257 | } 258 | } 259 | if m.XXX_unrecognized != nil { 260 | i += copy(dAtA[i:], m.XXX_unrecognized) 261 | } 262 | return i, nil 263 | } 264 | 265 | func (m *Rank) Marshal() (dAtA []byte, err error) { 266 | size := m.Size() 267 | dAtA = make([]byte, size) 268 | n, err := m.MarshalTo(dAtA) 269 | if err != nil { 270 | return nil, err 271 | } 272 | return dAtA[:n], nil 273 | } 274 | 275 | func (m *Rank) MarshalTo(dAtA []byte) (int, error) { 276 | var i int 277 | _ = i 278 | var l int 279 | _ = l 280 | if m.RankNum != 0 { 281 | dAtA[i] = 0x8 282 | i++ 283 | i = encodeVarintRank(dAtA, i, uint64(m.RankNum)) 284 | } 285 | if m.PlayerAttr != nil { 286 | dAtA[i] = 0x1a 287 | i++ 288 | i = encodeVarintRank(dAtA, i, uint64(m.PlayerAttr.Size())) 289 | n1, err := m.PlayerAttr.MarshalTo(dAtA[i:]) 290 | if err != nil { 291 | return 0, err 292 | } 293 | i += n1 294 | } 295 | if m.XXX_unrecognized != nil { 296 | i += copy(dAtA[i:], m.XXX_unrecognized) 297 | } 298 | return i, nil 299 | } 300 | 301 | func encodeVarintRank(dAtA []byte, offset int, v uint64) int { 302 | for v >= 1<<7 { 303 | dAtA[offset] = uint8(v&0x7f | 0x80) 304 | v >>= 7 305 | offset++ 306 | } 307 | dAtA[offset] = uint8(v) 308 | return offset + 1 309 | } 310 | func (m *ShowRankReq) Size() (n int) { 311 | var l int 312 | _ = l 313 | if m.Key != 0 { 314 | n += 1 + sovRank(uint64(m.Key)) 315 | } 316 | if m.XXX_unrecognized != nil { 317 | n += len(m.XXX_unrecognized) 318 | } 319 | return n 320 | } 321 | 322 | func (m *ShowRankResp) Size() (n int) { 323 | var l int 324 | _ = l 325 | if m.MyRank != 0 { 326 | n += 1 + sovRank(uint64(m.MyRank)) 327 | } 328 | l = len(m.NickName) 329 | if l > 0 { 330 | n += 1 + l + sovRank(uint64(l)) 331 | } 332 | if len(m.RankObj) > 0 { 333 | for _, e := range m.RankObj { 334 | l = e.Size() 335 | n += 1 + l + sovRank(uint64(l)) 336 | } 337 | } 338 | if m.XXX_unrecognized != nil { 339 | n += len(m.XXX_unrecognized) 340 | } 341 | return n 342 | } 343 | 344 | func (m *Rank) Size() (n int) { 345 | var l int 346 | _ = l 347 | if m.RankNum != 0 { 348 | n += 1 + sovRank(uint64(m.RankNum)) 349 | } 350 | if m.PlayerAttr != nil { 351 | l = m.PlayerAttr.Size() 352 | n += 1 + l + sovRank(uint64(l)) 353 | } 354 | if m.XXX_unrecognized != nil { 355 | n += len(m.XXX_unrecognized) 356 | } 357 | return n 358 | } 359 | 360 | func sovRank(x uint64) (n int) { 361 | for { 362 | n++ 363 | x >>= 7 364 | if x == 0 { 365 | break 366 | } 367 | } 368 | return n 369 | } 370 | func sozRank(x uint64) (n int) { 371 | return sovRank(uint64((x << 1) ^ uint64((int64(x) >> 63)))) 372 | } 373 | func (m *ShowRankReq) Unmarshal(dAtA []byte) error { 374 | l := len(dAtA) 375 | iNdEx := 0 376 | for iNdEx < l { 377 | preIndex := iNdEx 378 | var wire uint64 379 | for shift := uint(0); ; shift += 7 { 380 | if shift >= 64 { 381 | return ErrIntOverflowRank 382 | } 383 | if iNdEx >= l { 384 | return io.ErrUnexpectedEOF 385 | } 386 | b := dAtA[iNdEx] 387 | iNdEx++ 388 | wire |= (uint64(b) & 0x7F) << shift 389 | if b < 0x80 { 390 | break 391 | } 392 | } 393 | fieldNum := int32(wire >> 3) 394 | wireType := int(wire & 0x7) 395 | if wireType == 4 { 396 | return fmt.Errorf("proto: ShowRankReq: wiretype end group for non-group") 397 | } 398 | if fieldNum <= 0 { 399 | return fmt.Errorf("proto: ShowRankReq: illegal tag %d (wire type %d)", fieldNum, wire) 400 | } 401 | switch fieldNum { 402 | case 1: 403 | if wireType != 0 { 404 | return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) 405 | } 406 | m.Key = 0 407 | for shift := uint(0); ; shift += 7 { 408 | if shift >= 64 { 409 | return ErrIntOverflowRank 410 | } 411 | if iNdEx >= l { 412 | return io.ErrUnexpectedEOF 413 | } 414 | b := dAtA[iNdEx] 415 | iNdEx++ 416 | m.Key |= (RankEnum(b) & 0x7F) << shift 417 | if b < 0x80 { 418 | break 419 | } 420 | } 421 | default: 422 | iNdEx = preIndex 423 | skippy, err := skipRank(dAtA[iNdEx:]) 424 | if err != nil { 425 | return err 426 | } 427 | if skippy < 0 { 428 | return ErrInvalidLengthRank 429 | } 430 | if (iNdEx + skippy) > l { 431 | return io.ErrUnexpectedEOF 432 | } 433 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 434 | iNdEx += skippy 435 | } 436 | } 437 | 438 | if iNdEx > l { 439 | return io.ErrUnexpectedEOF 440 | } 441 | return nil 442 | } 443 | func (m *ShowRankResp) Unmarshal(dAtA []byte) error { 444 | l := len(dAtA) 445 | iNdEx := 0 446 | for iNdEx < l { 447 | preIndex := iNdEx 448 | var wire uint64 449 | for shift := uint(0); ; shift += 7 { 450 | if shift >= 64 { 451 | return ErrIntOverflowRank 452 | } 453 | if iNdEx >= l { 454 | return io.ErrUnexpectedEOF 455 | } 456 | b := dAtA[iNdEx] 457 | iNdEx++ 458 | wire |= (uint64(b) & 0x7F) << shift 459 | if b < 0x80 { 460 | break 461 | } 462 | } 463 | fieldNum := int32(wire >> 3) 464 | wireType := int(wire & 0x7) 465 | if wireType == 4 { 466 | return fmt.Errorf("proto: ShowRankResp: wiretype end group for non-group") 467 | } 468 | if fieldNum <= 0 { 469 | return fmt.Errorf("proto: ShowRankResp: illegal tag %d (wire type %d)", fieldNum, wire) 470 | } 471 | switch fieldNum { 472 | case 1: 473 | if wireType != 0 { 474 | return fmt.Errorf("proto: wrong wireType = %d for field MyRank", wireType) 475 | } 476 | m.MyRank = 0 477 | for shift := uint(0); ; shift += 7 { 478 | if shift >= 64 { 479 | return ErrIntOverflowRank 480 | } 481 | if iNdEx >= l { 482 | return io.ErrUnexpectedEOF 483 | } 484 | b := dAtA[iNdEx] 485 | iNdEx++ 486 | m.MyRank |= (int32(b) & 0x7F) << shift 487 | if b < 0x80 { 488 | break 489 | } 490 | } 491 | case 2: 492 | if wireType != 2 { 493 | return fmt.Errorf("proto: wrong wireType = %d for field NickName", wireType) 494 | } 495 | var stringLen uint64 496 | for shift := uint(0); ; shift += 7 { 497 | if shift >= 64 { 498 | return ErrIntOverflowRank 499 | } 500 | if iNdEx >= l { 501 | return io.ErrUnexpectedEOF 502 | } 503 | b := dAtA[iNdEx] 504 | iNdEx++ 505 | stringLen |= (uint64(b) & 0x7F) << shift 506 | if b < 0x80 { 507 | break 508 | } 509 | } 510 | intStringLen := int(stringLen) 511 | if intStringLen < 0 { 512 | return ErrInvalidLengthRank 513 | } 514 | postIndex := iNdEx + intStringLen 515 | if postIndex > l { 516 | return io.ErrUnexpectedEOF 517 | } 518 | m.NickName = string(dAtA[iNdEx:postIndex]) 519 | iNdEx = postIndex 520 | case 3: 521 | if wireType != 2 { 522 | return fmt.Errorf("proto: wrong wireType = %d for field RankObj", wireType) 523 | } 524 | var msglen int 525 | for shift := uint(0); ; shift += 7 { 526 | if shift >= 64 { 527 | return ErrIntOverflowRank 528 | } 529 | if iNdEx >= l { 530 | return io.ErrUnexpectedEOF 531 | } 532 | b := dAtA[iNdEx] 533 | iNdEx++ 534 | msglen |= (int(b) & 0x7F) << shift 535 | if b < 0x80 { 536 | break 537 | } 538 | } 539 | if msglen < 0 { 540 | return ErrInvalidLengthRank 541 | } 542 | postIndex := iNdEx + msglen 543 | if postIndex > l { 544 | return io.ErrUnexpectedEOF 545 | } 546 | m.RankObj = append(m.RankObj, &Rank{}) 547 | if err := m.RankObj[len(m.RankObj)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { 548 | return err 549 | } 550 | iNdEx = postIndex 551 | default: 552 | iNdEx = preIndex 553 | skippy, err := skipRank(dAtA[iNdEx:]) 554 | if err != nil { 555 | return err 556 | } 557 | if skippy < 0 { 558 | return ErrInvalidLengthRank 559 | } 560 | if (iNdEx + skippy) > l { 561 | return io.ErrUnexpectedEOF 562 | } 563 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 564 | iNdEx += skippy 565 | } 566 | } 567 | 568 | if iNdEx > l { 569 | return io.ErrUnexpectedEOF 570 | } 571 | return nil 572 | } 573 | func (m *Rank) Unmarshal(dAtA []byte) error { 574 | l := len(dAtA) 575 | iNdEx := 0 576 | for iNdEx < l { 577 | preIndex := iNdEx 578 | var wire uint64 579 | for shift := uint(0); ; shift += 7 { 580 | if shift >= 64 { 581 | return ErrIntOverflowRank 582 | } 583 | if iNdEx >= l { 584 | return io.ErrUnexpectedEOF 585 | } 586 | b := dAtA[iNdEx] 587 | iNdEx++ 588 | wire |= (uint64(b) & 0x7F) << shift 589 | if b < 0x80 { 590 | break 591 | } 592 | } 593 | fieldNum := int32(wire >> 3) 594 | wireType := int(wire & 0x7) 595 | if wireType == 4 { 596 | return fmt.Errorf("proto: Rank: wiretype end group for non-group") 597 | } 598 | if fieldNum <= 0 { 599 | return fmt.Errorf("proto: Rank: illegal tag %d (wire type %d)", fieldNum, wire) 600 | } 601 | switch fieldNum { 602 | case 1: 603 | if wireType != 0 { 604 | return fmt.Errorf("proto: wrong wireType = %d for field RankNum", wireType) 605 | } 606 | m.RankNum = 0 607 | for shift := uint(0); ; shift += 7 { 608 | if shift >= 64 { 609 | return ErrIntOverflowRank 610 | } 611 | if iNdEx >= l { 612 | return io.ErrUnexpectedEOF 613 | } 614 | b := dAtA[iNdEx] 615 | iNdEx++ 616 | m.RankNum |= (int32(b) & 0x7F) << shift 617 | if b < 0x80 { 618 | break 619 | } 620 | } 621 | case 3: 622 | if wireType != 2 { 623 | return fmt.Errorf("proto: wrong wireType = %d for field PlayerAttr", wireType) 624 | } 625 | var msglen int 626 | for shift := uint(0); ; shift += 7 { 627 | if shift >= 64 { 628 | return ErrIntOverflowRank 629 | } 630 | if iNdEx >= l { 631 | return io.ErrUnexpectedEOF 632 | } 633 | b := dAtA[iNdEx] 634 | iNdEx++ 635 | msglen |= (int(b) & 0x7F) << shift 636 | if b < 0x80 { 637 | break 638 | } 639 | } 640 | if msglen < 0 { 641 | return ErrInvalidLengthRank 642 | } 643 | postIndex := iNdEx + msglen 644 | if postIndex > l { 645 | return io.ErrUnexpectedEOF 646 | } 647 | if m.PlayerAttr == nil { 648 | m.PlayerAttr = &PlayerAttr{} 649 | } 650 | if err := m.PlayerAttr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { 651 | return err 652 | } 653 | iNdEx = postIndex 654 | default: 655 | iNdEx = preIndex 656 | skippy, err := skipRank(dAtA[iNdEx:]) 657 | if err != nil { 658 | return err 659 | } 660 | if skippy < 0 { 661 | return ErrInvalidLengthRank 662 | } 663 | if (iNdEx + skippy) > l { 664 | return io.ErrUnexpectedEOF 665 | } 666 | m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) 667 | iNdEx += skippy 668 | } 669 | } 670 | 671 | if iNdEx > l { 672 | return io.ErrUnexpectedEOF 673 | } 674 | return nil 675 | } 676 | func skipRank(dAtA []byte) (n int, err error) { 677 | l := len(dAtA) 678 | iNdEx := 0 679 | for iNdEx < l { 680 | var wire uint64 681 | for shift := uint(0); ; shift += 7 { 682 | if shift >= 64 { 683 | return 0, ErrIntOverflowRank 684 | } 685 | if iNdEx >= l { 686 | return 0, io.ErrUnexpectedEOF 687 | } 688 | b := dAtA[iNdEx] 689 | iNdEx++ 690 | wire |= (uint64(b) & 0x7F) << shift 691 | if b < 0x80 { 692 | break 693 | } 694 | } 695 | wireType := int(wire & 0x7) 696 | switch wireType { 697 | case 0: 698 | for shift := uint(0); ; shift += 7 { 699 | if shift >= 64 { 700 | return 0, ErrIntOverflowRank 701 | } 702 | if iNdEx >= l { 703 | return 0, io.ErrUnexpectedEOF 704 | } 705 | iNdEx++ 706 | if dAtA[iNdEx-1] < 0x80 { 707 | break 708 | } 709 | } 710 | return iNdEx, nil 711 | case 1: 712 | iNdEx += 8 713 | return iNdEx, nil 714 | case 2: 715 | var length int 716 | for shift := uint(0); ; shift += 7 { 717 | if shift >= 64 { 718 | return 0, ErrIntOverflowRank 719 | } 720 | if iNdEx >= l { 721 | return 0, io.ErrUnexpectedEOF 722 | } 723 | b := dAtA[iNdEx] 724 | iNdEx++ 725 | length |= (int(b) & 0x7F) << shift 726 | if b < 0x80 { 727 | break 728 | } 729 | } 730 | iNdEx += length 731 | if length < 0 { 732 | return 0, ErrInvalidLengthRank 733 | } 734 | return iNdEx, nil 735 | case 3: 736 | for { 737 | var innerWire uint64 738 | var start int = iNdEx 739 | for shift := uint(0); ; shift += 7 { 740 | if shift >= 64 { 741 | return 0, ErrIntOverflowRank 742 | } 743 | if iNdEx >= l { 744 | return 0, io.ErrUnexpectedEOF 745 | } 746 | b := dAtA[iNdEx] 747 | iNdEx++ 748 | innerWire |= (uint64(b) & 0x7F) << shift 749 | if b < 0x80 { 750 | break 751 | } 752 | } 753 | innerWireType := int(innerWire & 0x7) 754 | if innerWireType == 4 { 755 | break 756 | } 757 | next, err := skipRank(dAtA[start:]) 758 | if err != nil { 759 | return 0, err 760 | } 761 | iNdEx = start + next 762 | } 763 | return iNdEx, nil 764 | case 4: 765 | return iNdEx, nil 766 | case 5: 767 | iNdEx += 4 768 | return iNdEx, nil 769 | default: 770 | return 0, fmt.Errorf("proto: illegal wireType %d", wireType) 771 | } 772 | } 773 | panic("unreachable") 774 | } 775 | 776 | var ( 777 | ErrInvalidLengthRank = fmt.Errorf("proto: negative length found during unmarshaling") 778 | ErrIntOverflowRank = fmt.Errorf("proto: integer overflow") 779 | ) 780 | 781 | func init() { proto.RegisterFile("rank.proto", fileDescriptor_rank_e9617fcee290bf2c) } 782 | 783 | var fileDescriptor_rank_e9617fcee290bf2c = []byte{ 784 | // 251 bytes of a gzipped FileDescriptorProto 785 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8d, 0xcd, 0x4a, 0xc4, 0x30, 786 | 0x14, 0x85, 0x8d, 0x75, 0xfe, 0x6e, 0x64, 0xd4, 0x6c, 0xac, 0x0a, 0xa5, 0x76, 0x21, 0x5d, 0x0d, 787 | 0x52, 0x9f, 0x40, 0xc1, 0xed, 0x28, 0x11, 0xd7, 0x25, 0x95, 0x80, 0x4e, 0xe7, 0xa6, 0x31, 0x26, 788 | 0x48, 0xde, 0xc4, 0x47, 0x72, 0xe9, 0x23, 0x48, 0x7d, 0x11, 0x49, 0xa6, 0xe8, 0xac, 0x12, 0xee, 789 | 0xf7, 0x9d, 0x73, 0x00, 0x8c, 0x50, 0xed, 0x42, 0x9b, 0xce, 0x76, 0x6c, 0x14, 0x9f, 0xd3, 0xb9, 790 | 0x54, 0x0e, 0xad, 0xd7, 0x72, 0x73, 0x2e, 0x2e, 0x81, 0x3e, 0x3c, 0x77, 0xef, 0x5c, 0xa8, 0x96, 791 | 0xcb, 0x57, 0x76, 0x0e, 0x49, 0x2b, 0x7d, 0x4a, 0x72, 0x52, 0xce, 0xab, 0x83, 0x8d, 0xb3, 0x08, 792 | 0xf0, 0x56, 0x39, 0xe4, 0x81, 0x15, 0x6b, 0xd8, 0xff, 0x4f, 0xbc, 0x69, 0x76, 0x0c, 0x13, 0xf4, 793 | 0x75, 0x58, 0x8a, 0xb1, 0x11, 0x1f, 0xa3, 0x0f, 0x90, 0x9d, 0xc1, 0x4c, 0xbd, 0x3c, 0xb5, 0xb5, 794 | 0x12, 0x28, 0xd3, 0xdd, 0x9c, 0x94, 0x33, 0x3e, 0x0d, 0x87, 0xa5, 0x40, 0xc9, 0x2e, 0x60, 0x1a, 795 | 0x22, 0x75, 0xd7, 0xac, 0xd2, 0x24, 0x4f, 0x4a, 0x5a, 0xd1, 0xad, 0x35, 0x3e, 0x09, 0xf0, 0xae, 796 | 0x59, 0x15, 0x8f, 0xb0, 0x17, 0xcb, 0x4e, 0x06, 0x5f, 0x39, 0x1c, 0x66, 0xa2, 0xb2, 0x74, 0xc8, 797 | 0x2a, 0xa0, 0x7a, 0x2d, 0xbc, 0x34, 0xb5, 0xb0, 0xd6, 0xa4, 0x49, 0x4e, 0x4a, 0x5a, 0x1d, 0x0d, 798 | 0x6d, 0xf7, 0x91, 0x5c, 0x5b, 0x6b, 0x38, 0xe8, 0xbf, 0xff, 0xcd, 0xe1, 0x67, 0x9f, 0x91, 0xaf, 799 | 0x3e, 0x23, 0xdf, 0x7d, 0x46, 0x3e, 0x7e, 0xb2, 0x9d, 0x66, 0x1c, 0xfd, 0xab, 0xdf, 0x00, 0x00, 800 | 0x00, 0xff, 0xff, 0x8d, 0xff, 0x72, 0x5c, 0x34, 0x01, 0x00, 0x00, 801 | } 802 | -------------------------------------------------------------------------------- /proto/rank.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | import "enumtype.proto"; 4 | 5 | package proto; 6 | 7 | // 查看排行榜 8 | message ShowRankReq { 9 | RankEnum key = 1; // 排行榜枚举 10 | } 11 | 12 | // 登录响应 13 | message ShowRankResp { 14 | int32 my_rank = 1; // 我的排名 15 | string nick_name = 2; // 我的昵称 16 | repeated Rank rank_obj = 3; // 排行榜属性 17 | } 18 | 19 | message Rank { 20 | int32 rank_num = 1; // 名次 21 | PlayerAttr player_attr = 3; 22 | } -------------------------------------------------------------------------------- /script/ctl.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | start(){ 4 | cd ../server 5 | go run main.go 6 | } 7 | 8 | proto(){ 9 | cd ../proto/ 10 | ./export.sh 11 | } 12 | 13 | config(){ 14 | cd ../../acinconfig/bin 15 | ./acinconfig 16 | } 17 | 18 | help() 19 | { 20 | echo " manager command: " 21 | echo " start 以正常服务器方式启动 " 22 | echo " stop 先踢人下线再关闭服务器 " 23 | echo " remote 远程连接服务器 " 24 | echo " proto 生成protobuff文件 " 25 | echo " config 生成配置文件 " 26 | } 27 | 28 | case $1 in 29 | 'start') start ;; 30 | 'stop') stop ;; 31 | 'remote') remote ;; 32 | 'proto') proto ;; 33 | 'config') config ;; 34 | *) help ;; 35 | esac -------------------------------------------------------------------------------- /server/db/dbautoid.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | ) 7 | 8 | type increaseId struct { 9 | userId int32 10 | mailId int32 11 | taskId int32 12 | mutex sync.Mutex 13 | } 14 | 15 | var IdInstance *increaseId // 全局共享实例,id分配 16 | 17 | func NewIncrease() { 18 | userId := GetUserMaxId() 19 | fmt.Println("-----------max userid id = ", userId) 20 | mailId := GetMailMaxId() 21 | fmt.Println("-----------max mailid id = ", mailId) 22 | IdInstance = &increaseId{userId:userId, mailId:mailId} 23 | } 24 | 25 | func (i *increaseId) GetNewUserId() (userId int32) { 26 | i.mutex.Lock() 27 | defer i.mutex.Unlock() 28 | userId = i.userId 29 | i.userId += 1 30 | return 31 | } 32 | 33 | func (i *increaseId) GetNewMailId() (mailId int32) { 34 | i.mutex.Lock() 35 | defer i.mutex.Unlock() 36 | mailId = i.mailId 37 | i.mailId += 1 38 | return 39 | } 40 | 41 | -------------------------------------------------------------------------------- /server/db/dbrank.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "fmt" 5 | "slg_game_server/server/util" 6 | "slg_game_server/server/include" 7 | ) 8 | 9 | type PowerRank include.RankPower 10 | 11 | func (p *PowerRank) getForceRank() { 12 | rows, err := DB.Query("select user_id, lord_name, domain, force from t_user " + 13 | "order by force desc,domain desc limit 0, ?") 14 | defer rows.Close() 15 | util.CheckErr(err) 16 | for rows.Next() { 17 | err = rows.Scan(&p.UserId, &p.LordName, &p.Domain, &p.Force) 18 | util.CheckErr(err) 19 | fmt.Println("---------------rank:", p) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /server/db/dbuserattr.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "fmt" 5 | "database/sql" 6 | "slg_game_server/server/util" 7 | "slg_game_server/config/dataConfig" 8 | "slg_game_server/server/include" 9 | ) 10 | 11 | type Attr include.PlayerAttr 12 | 13 | func (a *Attr) InitData(name interface{}) interface{} { 14 | rows, err := DB.Query("select * from t_user where acct_name = ?", name) 15 | defer rows.Close() 16 | util.CheckErr(err) 17 | emptyData := true 18 | for rows.Next() { 19 | err = rows.Scan(&a.UserId, &a.AcctName, &a.LordName, &a.Sign, &a.X, &a.Y, &a.Country, &a.Level, 20 | &a.Exp, &a.Wood, &a.Iron, &a.Stone, &a.Forage, &a.Gold, &a.Diamond, &a.BindDiamond, 21 | &a.Decree, &a.ArmyOrder, &a.Power, &a.Domain) 22 | util.CheckErr(err) 23 | emptyData = false 24 | } 25 | 26 | if emptyData { 27 | userId := IdInstance.GetNewUserId() 28 | a.UserId = userId 29 | a.AcctName = name.(string) 30 | 31 | // 读取配置初始化值 32 | a.Level = dataConfig.GetCfgPlayerAttr(20).InitData 33 | a.Exp = dataConfig.GetCfgPlayerAttr(21).InitData 34 | a.Wood = dataConfig.GetCfgPlayerAttr(22).InitData 35 | a.Iron = dataConfig.GetCfgPlayerAttr(23).InitData 36 | a.Stone = dataConfig.GetCfgPlayerAttr(24).InitData 37 | a.Forage = dataConfig.GetCfgPlayerAttr(25).InitData 38 | a.Gold = dataConfig.GetCfgPlayerAttr(26).InitData 39 | a.Diamond = dataConfig.GetCfgPlayerAttr(27).InitData 40 | a.BindDiamond = dataConfig.GetCfgPlayerAttr(28).InitData 41 | a.Decree = dataConfig.GetCfgPlayerAttr(29).InitData 42 | a.ArmyOrder = dataConfig.GetCfgPlayerAttr(30).InitData 43 | a.Power = dataConfig.GetCfgPlayerAttr(31).InitData 44 | a.Domain = dataConfig.GetCfgPlayerAttr(32).InitData 45 | fmt.Println("create new userId = ", userId) 46 | a.SaveData() 47 | } 48 | 49 | return a 50 | } 51 | 52 | func (a *Attr) SaveData() interface{} { 53 | fmt.Println("---------------------------------- save a:", a.LordName, "--", a.Sign) 54 | _, err := DB.Exec("replace into t_user(user_id, acct_name, lord_name, sign, x, y, country, level, exp, wood, iron," + 55 | "stone, forage, gold, diamond, bind_diamond, decree, army_order, power, domain) " + 56 | "values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 57 | a.UserId, a.AcctName, a.LordName, a.Sign, a.X, a.Y, a.Country, a.Level, 58 | a.Exp, a.Wood, a.Iron, a.Stone, a.Forage, a.Gold, a.Diamond, a.BindDiamond, 59 | a.Decree, a.ArmyOrder, a.Power, a.Domain) 60 | util.CheckErr(err) 61 | return nil 62 | } 63 | 64 | func GetUserMaxId() int32 { 65 | rows := DB.QueryRow("select max(user_id)+1 as id from t_user") 66 | var num sql.NullInt64 67 | err := rows.Scan(&num) 68 | util.CheckErr(err) 69 | // 因为这里有可能为空值 70 | if !num.Valid { 71 | return 100001 72 | 73 | }else { 74 | return int32(num.Int64) 75 | } 76 | 77 | } -------------------------------------------------------------------------------- /server/db/dbusermail.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "fmt" 5 | "database/sql" 6 | "slg_game_server/server/util" 7 | "slg_game_server/server/include" 8 | ) 9 | 10 | type Mail include.PlayerMail 11 | 12 | func (m *Mail) InitData(name interface{}) interface{} { 13 | return m 14 | } 15 | 16 | func (m *Mail) SaveData() interface{} { 17 | return nil 18 | } 19 | 20 | func GetMailMaxId() int32 { 21 | rows := DB.QueryRow("select max(mail_id)+1 as id from t_user_mail") 22 | var num sql.NullInt64 23 | err := rows.Scan(&num) 24 | util.CheckErr(err) 25 | fmt.Println("------------null", num.Int64) 26 | if !num.Valid { 27 | return 100001 28 | 29 | }else { 30 | return int32(num.Int64) 31 | } 32 | } -------------------------------------------------------------------------------- /server/db/dbuserrank.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "slg_game_server/server/util" 5 | "slg_game_server/server/include" 6 | proto3 "slg_game_server/proto" 7 | ) 8 | 9 | func GetDBPowerRank(num int) (powerRankObj []*proto3.Rank) { 10 | rows, err := DB.Query("select user_id, lord_name, level, power, domain from t_user " + 11 | "order by power desc, level desc, domain desc limit 0, ?", num) 12 | defer rows.Close() 13 | util.CheckErr(err) 14 | //var rankNum int32 15 | for rows.Next() { 16 | //rankNum += 1 17 | player := &include.PlayerAttr{} 18 | err = rows.Scan(&player.UserId, &player.LordName, &player.Level, &player.Power, &player.Domain) 19 | util.CheckErr(err) 20 | 21 | playerAttr := &proto3.PlayerAttr{ 22 | UserId: player.UserId, 23 | NickName: player.LordName, 24 | Level: player.Level, 25 | Power: player.Power, 26 | Domain: player.Domain, 27 | } 28 | powerRankObj = append(powerRankObj, &proto3.Rank{PlayerAttr:playerAttr}) 29 | util.CheckErr(err) 30 | } 31 | return 32 | 33 | } -------------------------------------------------------------------------------- /server/db/dbusertask.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import "slg_game_server/server/include" 4 | 5 | type Task include.PlayerTask 6 | 7 | func (t *Task) InitData(name interface{}) interface{} { 8 | return t 9 | } 10 | 11 | func (t *Task) SaveData() interface{} { 12 | return nil 13 | } -------------------------------------------------------------------------------- /server/db/mysql.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "database/sql" 5 | _ "github.com/go-sql-driver/mysql" 6 | "slg_game_server/server/util" 7 | ) 8 | 9 | var DB *sql.DB 10 | 11 | func init() { 12 | var err error 13 | DB, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/game?charset=utf8") 14 | util.CheckErr(err) 15 | err = DB.Ping() 16 | util.CheckErr(err) 17 | //defer DB.Close() why close? 18 | DB.SetMaxOpenConns(100) 19 | DB.SetMaxIdleConns(50) 20 | 21 | } -------------------------------------------------------------------------------- /server/game/rank/powerrank.go: -------------------------------------------------------------------------------- 1 | package rank 2 | 3 | import ( 4 | "fmt" 5 | "sort" 6 | "slg_game_server/server/db" 7 | proto3 "slg_game_server/proto" 8 | ) 9 | 10 | // 实时排名榜-势力值power 11 | 12 | type powerRank struct { 13 | *rankObj 14 | powerList []*proto3.Rank 15 | } 16 | 17 | func (p *powerRank) Less(i, j int) bool { 18 | return p.powerList[i].PlayerAttr.Power > p.powerList[j].PlayerAttr.Power 19 | } 20 | 21 | func NewPowerRank(obj *rankObj) *powerRank { 22 | p := db.GetDBPowerRank(powerNum) 23 | return &powerRank{rankObj:obj, powerList:p} 24 | } 25 | 26 | func (p *powerRank) GetPowerRank(userId int32) (powerList []*proto3.Rank, myRank int32) { 27 | //r.mutex.RLock() 28 | //defer r.mutex.RUnlock() 29 | powerList = p.powerList 30 | var rankNum int32 31 | for _, value := range powerList { 32 | rankNum += 1 33 | value.RankNum = rankNum 34 | fmt.Printf("uid = %v, RankNum = %v, power = %v\n", value.PlayerAttr.UserId, value.RankNum, value.PlayerAttr.Power) 35 | if userId == value.PlayerAttr.UserId { 36 | myRank = rankNum 37 | } 38 | } 39 | fmt.Println("myrank = ", myRank) 40 | return powerList, myRank 41 | } 42 | 43 | func (p *powerRank) SetPowerRank(attr *db.Attr) { 44 | rankLen := len(p.powerList) 45 | last := p.powerList[rankLen - 1] 46 | _, myRank := p.GetPowerRank(attr.UserId) 47 | fmt.Printf("---------------- power : %d, attrpow : %d, last : %d\n", attr.Power, last.PlayerAttr.Power, last.PlayerAttr.Power) 48 | if attr.Power > last.PlayerAttr.Power || myRank > 0 { 49 | msg := &rankMsg{msg:"SetPowerRank", attr:attr} 50 | p.rankObj.rankChan <- msg 51 | //p.rankObj.rankChan <- msg 52 | fmt.Println("---------- rankchan send") 53 | } 54 | } 55 | 56 | func (p *powerRank) PowerRankSort(attr *db.Attr) interface{} { 57 | powerList, myRank := p.GetPowerRank(attr.UserId) 58 | playerAttr := &proto3.PlayerAttr{ 59 | UserId: attr.UserId, 60 | NickName:attr.LordName, 61 | Level: attr.Level, 62 | Power: attr.Power, 63 | Domain: attr.Domain, 64 | } 65 | if myRank > 0 { // 前300名里面有玩家变化 66 | index := myRank - 1 67 | powerList[index].PlayerAttr = playerAttr // 首先更新这个玩家的信息 68 | if myRank == 1 && attr.Power >= powerList[index + 1].PlayerAttr.Power { // 排名第一,而且最新值仍然大于第二名,排名不需要变动,只需要更新值 69 | return nil 70 | } 71 | // 最后一名,而且最新值仍然低于比倒数第二名,则不需要变动 72 | if myRank == int32(len(powerList)) && powerList[index - 1].PlayerAttr.Power >= attr.Power { 73 | return nil 74 | } 75 | if myRank > 1 && (powerList[index - 1].PlayerAttr.Power >= attr.Power && attr.Power >= powerList[index + 1].PlayerAttr.Power) { 76 | return nil 77 | } 78 | p.rankObj.sortRank = powerList 79 | sort.Sort(p) 80 | }else { // 最新进入前300名,需要把最后一个玩家t掉 81 | lastIndex := len(powerList) - 1 82 | powerList[lastIndex].PlayerAttr = playerAttr 83 | p.rankObj.sortRank = powerList 84 | sort.Sort(p) 85 | } 86 | return nil 87 | 88 | } 89 | -------------------------------------------------------------------------------- /server/game/rank/rank.go: -------------------------------------------------------------------------------- 1 | package rank 2 | 3 | import ( 4 | "fmt" 5 | "slg_game_server/server/db" 6 | proto3 "slg_game_server/proto" 7 | ) 8 | 9 | const ( 10 | powerNum = 300 11 | ) 12 | 13 | type rankMsg struct { 14 | msg string 15 | attr *db.Attr 16 | } 17 | 18 | // 父类:用于通信和排序 19 | type rankObj struct { 20 | rankChan chan *rankMsg 21 | sortRank []*proto3.Rank 22 | //PowerRank *powerRank 23 | } 24 | 25 | // 存储所有子排行榜实例对象 26 | type RkInstances struct { 27 | PowerRank *powerRank 28 | } 29 | 30 | var RkInstance *RkInstances // 全局共享实例,排行榜 31 | 32 | // 排序通用接口 33 | func (r *rankObj) Len() int { return len(r.sortRank) } 34 | func (r *rankObj) Swap(i, j int) { r.sortRank[i], r.sortRank[j] = r.sortRank[j], r.sortRank[i] } 35 | 36 | func NewRank() { 37 | rankChan := make(chan *rankMsg, 1024) 38 | rankObj := &rankObj{rankChan:rankChan} 39 | powerRank := NewPowerRank(rankObj) 40 | RkInstance = &RkInstances{PowerRank:powerRank} 41 | go func() { 42 | for { 43 | rankMsg, ok := <- rankObj.rankChan 44 | if !ok { 45 | fmt.Println("--------------- rankChan close = ", rankMsg) 46 | return 47 | } 48 | switch rankMsg.msg { 49 | case "SetPowerRank": 50 | //RkInstance.PowerRank.PowerRankSort(rankMsg.attr) 51 | powerRank.PowerRankSort(rankMsg.attr) 52 | default: 53 | 54 | } 55 | } 56 | }() 57 | } 58 | -------------------------------------------------------------------------------- /server/game/user/player.go: -------------------------------------------------------------------------------- 1 | package user 2 | 3 | import ( 4 | "io" 5 | "fmt" 6 | "slg_game_server/server/db" 7 | "slg_game_server/server/global" 8 | "github.com/gogo/protobuf/proto" 9 | "slg_game_server/server/game/rank" 10 | proto3 "slg_game_server/proto" 11 | ) 12 | 13 | type Player struct { 14 | Attr *db.Attr 15 | Mail *db.Mail 16 | Task *db.Task 17 | Writer io.Writer 18 | writeChan chan interface{} // 等待接受的数据 19 | PidChan chan interface{} 20 | 21 | } 22 | 23 | func NewPlayer() *Player { 24 | player := new(Player) 25 | player.PidChan = make(chan interface{}, 1024) 26 | go func() { 27 | for { 28 | msgData, ok := <- player.PidChan 29 | if !ok { 30 | fmt.Println("--------------- pidchan close = ", msgData) 31 | return 32 | } 33 | switch msg := msgData.(type) { 34 | case *Message: 35 | fmt.Printf("--------------msgid = %v, pbData = %v\n", msg.Cmd, msg.PbData) 36 | Handler.Callback(msg.Cmd, msg.PbData, player) 37 | default: 38 | 39 | } 40 | } 41 | }() 42 | 43 | return player 44 | } 45 | 46 | func (player *Player) CreatePlayer(name interface{}){ 47 | 48 | var playerObj global.PlayerObj // 定义一个接口类型 49 | 50 | playerObj = new(db.Attr) 51 | player.Attr = playerObj.InitData(name).(*db.Attr) 52 | userId := player.Attr.UserId 53 | 54 | // 重复登录的玩家,需要先摧毁之前的旧对象 55 | OldPlayer := global.GloInstance.GetPlayer(userId) 56 | fmt.Println("------------ oldplayer", OldPlayer) 57 | if OldPlayer != nil { 58 | OldPlayer.(*Player).DestoryPlayer() 59 | } 60 | 61 | playerObj = new(db.Mail) 62 | player.Mail = playerObj.InitData(name).(*db.Mail) 63 | 64 | playerObj = new(db.Task) 65 | player.Task = playerObj.InitData(name).(*db.Task) 66 | 67 | global.GloInstance.AddPlayer(userId, player) 68 | 69 | } 70 | 71 | func (player *Player) DestoryPlayer() { 72 | fmt.Println("--------------- DestoryPlayer = ") 73 | close(player.PidChan) 74 | close(player.writeChan) 75 | global.PlayerObj.SaveData(player.Attr) 76 | global.GloInstance.DelPlayer(player.Attr.UserId) 77 | 78 | } 79 | 80 | func (player *Player) SetWriteChan(sendChan chan interface{}) { 81 | player.writeChan = sendChan 82 | } 83 | 84 | func (player *Player) SendMessage(msg interface{}) { 85 | fmt.Println("SendMessage", msg) 86 | player.writeChan <- msg 87 | } 88 | 89 | func (player *Player) EventHandler(cmd proto3.ProtoCmd, pbData proto.Message) { 90 | player.PidChan <- &Message{Cmd:cmd, PbData:pbData} 91 | } 92 | 93 | func (player *Player) getPlayerAttr(attrId int32) int32 { 94 | return 0 95 | } 96 | 97 | func (player *Player) GetLevel() int32 { 98 | return player.Attr.Level 99 | } 100 | 101 | func (player *Player) SetLevel(level int32) { 102 | player.Attr.Level = level 103 | } 104 | 105 | func (player *Player) SetPower(power int32) { 106 | player.Attr.Power = power 107 | rank.RkInstance.PowerRank.SetPowerRank(player.Attr) 108 | } -------------------------------------------------------------------------------- /server/game/user/player_handler.go: -------------------------------------------------------------------------------- 1 | package user 2 | 3 | import ( 4 | "github.com/gogo/protobuf/proto" 5 | proto3 "slg_game_server/proto" 6 | ) 7 | 8 | var Handler *MsgData 9 | 10 | type Message struct { 11 | Cmd proto3.ProtoCmd 12 | PbData proto.Message 13 | } 14 | 15 | type callBackFunc func(interface{}, *Player) interface{} 16 | 17 | type MsgData struct { 18 | msgInfo map[proto3.ProtoCmd]*MsgInfo 19 | } 20 | 21 | type MsgInfo struct { 22 | pb proto.Message 23 | callback callBackFunc 24 | } 25 | 26 | func init() { 27 | Handler = newRegister() 28 | } 29 | 30 | func newRegister() *MsgData { 31 | msgData := new(MsgData) 32 | msgData.msgInfo = make(map[proto3.ProtoCmd]*MsgInfo) 33 | return msgData 34 | } 35 | 36 | func (msgData *MsgData) RegistHandler(cmd proto3.ProtoCmd, pbData proto.Message, callback callBackFunc) { 37 | msgInfo := &MsgInfo{pb:pbData, callback:callback} 38 | msgData.msgInfo[cmd] = msgInfo 39 | } 40 | 41 | func (msgData *MsgData) GetPbData(cmd proto3.ProtoCmd) (pbData proto.Message) { 42 | msgInfo := msgData.msgInfo[cmd] 43 | pbData = msgInfo.pb 44 | return 45 | } 46 | 47 | // 可以实现不同的callback 48 | func (msgData *MsgData) Callback(cmd proto3.ProtoCmd, pbData proto.Message, player *Player) { 49 | msgInfo := msgData.msgInfo[cmd] 50 | callBack := msgInfo.callback 51 | callBack(pbData, player) 52 | 53 | } 54 | -------------------------------------------------------------------------------- /server/global/enum.go: -------------------------------------------------------------------------------- 1 | package global 2 | 3 | -------------------------------------------------------------------------------- /server/global/globalobj.go: -------------------------------------------------------------------------------- 1 | package global 2 | 3 | type PlayerObj interface { 4 | InitData(interface{}) interface{} 5 | SaveData() interface{} 6 | } -------------------------------------------------------------------------------- /server/global/playertable.go: -------------------------------------------------------------------------------- 1 | package global 2 | 3 | import ( 4 | "sync" 5 | "fmt" 6 | ) 7 | 8 | type globalList struct { 9 | playerList sync.Map 10 | len int32 11 | } 12 | 13 | var GloInstance *globalList 14 | 15 | func NewGlobalPlayers() { 16 | GloInstance = &globalList{} 17 | } 18 | 19 | func (g *globalList) GetPlayerList() (listMap sync.Map) { 20 | return g.playerList 21 | } 22 | 23 | func (g *globalList) GetPlayersNum() (int, int32) { 24 | length := 0 25 | g.playerList.Range(func(_, _ interface{}) bool { 26 | length++ 27 | return true 28 | }) 29 | return length, g.len 30 | } 31 | 32 | func (g *globalList) GetPlayerIdList() []int32 { 33 | var listId []int32 34 | g.playerList.Range(func(userId, _ interface{}) bool { 35 | listId = append(listId, userId.(int32)) 36 | return true 37 | }) 38 | return listId 39 | } 40 | 41 | func (g *globalList) AddPlayer(userId int32, player interface{}) { 42 | g.playerList.Store(userId, player) 43 | g.len += 1 44 | } 45 | 46 | func (g *globalList) DelPlayer(userId int32) { 47 | g.playerList.Delete(userId) 48 | g.len -= 1 49 | } 50 | 51 | func (g *globalList) GetPlayer(userId int32) (player interface{}) { 52 | player, _ = g.playerList.Load(userId) 53 | return 54 | } 55 | 56 | func (g *globalList) BroadCast() { 57 | g.playerList.Range(func(userId, _ interface{}) bool { 58 | fmt.Printf("---------------- broadcast userid = %d\n", userId) 59 | return true 60 | }) 61 | 62 | } -------------------------------------------------------------------------------- /server/handler/pplogin.go: -------------------------------------------------------------------------------- 1 | package handler 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | "slg_game_server/server/game/user" 7 | proto3 "slg_game_server/proto" 8 | ) 9 | 10 | func init() { 11 | user.Handler.RegistHandler(proto3.ProtoCmd_CMD_HeartBeatReq, &proto3.HeartBeatReq{}, handleHeartbeat) 12 | user.Handler.RegistHandler(proto3.ProtoCmd_CMD_LoginReq, &proto3.LoginReq{}, handleLogin) 13 | user.Handler.RegistHandler(proto3.ProtoCmd_CMD_LogoutReq, &proto3.LogOutReq{}, handleLogout) 14 | } 15 | 16 | func handleHeartbeat(req interface{}, player *user.Player) interface{} { 17 | cmd := proto3.ProtoCmd_CMD_HeartBeatResp 18 | unixTime := time.Now().Unix() 19 | pbData := &proto3.HeartBeatResp{ServerSec:unixTime} 20 | player.SendMessage(&user.Message{Cmd:cmd, PbData:pbData}) 21 | return nil 22 | } 23 | 24 | func handleLogin(req interface{}, player *user.Player) interface{} { 25 | msg := req.(*proto3.LoginReq) 26 | acctName := msg.AcctName 27 | 28 | player.CreatePlayer(acctName) 29 | fmt.Println("login success = ", player.Attr.UserId) 30 | 31 | cmd := proto3.ProtoCmd_CMD_LoginResp 32 | attr := player.Attr 33 | playerAttr := &proto3.PlayerAttr{ 34 | UserId:attr.UserId, NickName:attr.LordName, Sign:attr.Sign, X:attr.X, Y:attr.Y, Country:attr.Country, Level:attr.Level, 35 | Exp:attr.Exp, Wood:attr.Wood, Iron:attr.Iron, Stone:attr.Stone, Forage:attr.Forage, Gold:attr.Gold, Diamond:attr.Diamond, 36 | BindDiamond:attr.BindDiamond, Decree:attr.Decree, ArmyOrder:attr.ArmyOrder, Power:attr.Power, Domain:attr.Domain, 37 | } 38 | pbData := &proto3.LoginResp{PlayerAttr:playerAttr} // TODO 39 | player.SendMessage(&user.Message{Cmd:cmd, PbData:pbData}) 40 | 41 | //pbData1 := &proto3.ErrResp{Cmd:proto3.ProtoCmd_CMD_LoginReq, ErrCode:cmd, ErrMsg:"fuck"} // TODO delete 42 | //player.SendMessage(&user.Message{Cmd:cmd, PbData:pbData1}) 43 | 44 | return nil 45 | } 46 | 47 | 48 | 49 | func handleLogout(req interface{}, player *user.Player) interface{} { 50 | fmt.Println("------------handle_logOut = ", player.GetLevel()) 51 | player.DestoryPlayer() 52 | return nil 53 | } -------------------------------------------------------------------------------- /server/handler/pprank.go: -------------------------------------------------------------------------------- 1 | package handler 2 | 3 | import ( 4 | "fmt" 5 | "slg_game_server/server/game/user" 6 | "slg_game_server/server/game/rank" 7 | proto3 "slg_game_server/proto" 8 | ) 9 | 10 | func init() { 11 | user.Handler.RegistHandler(proto3.ProtoCmd_CMD_ShowRankReq, &proto3.ShowRankReq{}, handleRank) 12 | } 13 | 14 | func handleRank(req interface{}, player *user.Player) interface{} { 15 | msg := req.(*proto3.ShowRankReq) 16 | var rankObj []*proto3.Rank 17 | var myRank int32 18 | switch msg.Key { 19 | case proto3.RankEnum_Rank_Power: 20 | rankObj, myRank = rank.RkInstance.PowerRank.GetPowerRank(player.Attr.UserId) 21 | default: 22 | fmt.Println("rank client send err = ", msg) 23 | panic(msg) 24 | return nil 25 | } 26 | pbData := &proto3.ShowRankResp{MyRank:myRank, NickName:player.Attr.LordName, RankObj:rankObj} 27 | player.SendMessage(&user.Message{Cmd:proto3.ProtoCmd_CMD_ShowRankResp, PbData:pbData}) 28 | return nil 29 | } 30 | 31 | -------------------------------------------------------------------------------- /server/include/ranktype.go: -------------------------------------------------------------------------------- 1 | package include 2 | 3 | 4 | type RankPower struct { 5 | UserId int 6 | LordName string 7 | Country int 8 | Domain int 9 | Force int 10 | } 11 | -------------------------------------------------------------------------------- /server/include/usertype.go: -------------------------------------------------------------------------------- 1 | package include 2 | 3 | type PlayerAttr struct { 4 | UserId int32 5 | AcctName string // 账号名 6 | LordName string // 玩家领主名 7 | Sign string // 签名 8 | X int32 // 出生点X 9 | Y int32 // 出生点y 10 | Country int32 // 所属国家 11 | Level int32 // 等级 12 | Exp int32 // 经验 13 | Wood int32 // 木材 14 | Iron int32 // 铁矿 15 | Stone int32 // 石料 16 | Forage int32 // 粮草 17 | Gold int32 // 金币 18 | Diamond int32 // 钻石 19 | BindDiamond int32 // 绑定钻石 20 | Decree int32 // 政令 21 | ArmyOrder int32 // 军令 22 | Power int32 // 势力值 23 | Domain int32 // 领地个数 24 | 25 | } 26 | 27 | type PlayerMail struct { 28 | userId int32 29 | mailId int32 30 | } 31 | 32 | type PlayerTask struct { 33 | userId int32 34 | taskId int32 35 | } -------------------------------------------------------------------------------- /server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "slg_game_server/config/dataConfig" 5 | _ "slg_game_server/server/global" 6 | _ "slg_game_server/server/handler" 7 | _ "slg_game_server/server/network" 8 | _ "slg_game_server/server/db" 9 | ) 10 | 11 | 12 | 13 | func main() { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /server/network/command.go: -------------------------------------------------------------------------------- 1 | package network 2 | 3 | import ( 4 | "bufio" 5 | "os" 6 | "fmt" 7 | "strings" 8 | "strconv" 9 | "slg_game_server/server/global" 10 | "slg_game_server/config/dataConfig" 11 | "slg_game_server/server/game/user" 12 | ) 13 | 14 | func Help(args []string) int32 { 15 | fmt.Println(` 16 | Commands: 17 | help 18 | playerid 19 | playernum 20 | getplayer 21 | attrconfig 22 | setplayer 23 | broadcast 24 | kickplayer 25 | killserver 26 | 27 | `) 28 | return 0 29 | } 30 | 31 | func GetCommandHandlers() map[string]func(args []string) int32 { 32 | return map[string]func([]string) int32{ 33 | "help": Help, 34 | "playerid": ListPlayerId, 35 | "playernum": GetPlayersNum, 36 | "getplayer": GetPlayer, 37 | "setplayer": SetPlayer, 38 | "attrconfig": AttrConfig, 39 | "kickplayer": KickPlayer, 40 | "broadcast": BroadCast, 41 | "killserver": KillServer, 42 | } 43 | } 44 | 45 | func AttrConfig(args []string) int32 { 46 | if len(args) != 2 { 47 | return 0 48 | } 49 | id, err := strconv.Atoi(args[1]) 50 | if err != nil { 51 | fmt.Println(" should be an integer.") 52 | return 0 53 | } 54 | data := dataConfig.GetCfgPlayerAttr(int32(id)).InitData 55 | fmt.Println(data) 56 | return 0 57 | } 58 | 59 | func SetPlayer(args []string) int32 { 60 | if len(args) != 3 { 61 | return 0 62 | } 63 | userId, err := strconv.Atoi(args[1]) 64 | if err != nil { 65 | fmt.Println(" should be an integer.") 66 | return 0 67 | } 68 | power, err := strconv.Atoi(args[2]) 69 | if err != nil { 70 | fmt.Println(" should be an integer.") 71 | return 0 72 | } 73 | player := global.GloInstance.GetPlayer(int32(userId)) 74 | if player != nil { 75 | p := player.(*user.Player) 76 | fmt.Println("-------------- player: ", p.Attr.Power) 77 | p.SetPower(int32(power)) 78 | } 79 | return 0 80 | } 81 | 82 | func ListPlayerId(args []string) int32 { 83 | idList := global.GloInstance.GetPlayerIdList() 84 | fmt.Println("-------------- idlist: ", idList) 85 | return 0 86 | } 87 | 88 | func GetPlayersNum(args []string) int32 { 89 | playerNum, caleNum := global.GloInstance.GetPlayersNum() 90 | fmt.Printf("--------- mapNum: %d, caleNum: %d\n", playerNum, caleNum) 91 | 92 | return 0 93 | } 94 | 95 | func GetPlayer(args []string) int32 { 96 | if len(args) != 2 { 97 | return 0 98 | } 99 | userId, err := strconv.Atoi(args[1]) 100 | if err != nil { 101 | fmt.Println(" should be an integer.") 102 | return 0 103 | } 104 | player := global.GloInstance.GetPlayer(int32(userId)) 105 | if player != nil { 106 | p := player.(*user.Player) 107 | fmt.Printf("playerinfo: userid: %v, username: %v, level: %v\n", p.Attr.UserId, p.Attr.AcctName, p.Attr.Level) 108 | } 109 | return 0 110 | } 111 | 112 | func KickPlayer(args []string) int32 { 113 | if len(args) != 2 { 114 | return 0 115 | } 116 | userId, err := strconv.Atoi(args[1]) 117 | if err != nil { 118 | fmt.Println(" should be an integer.") 119 | return 0 120 | } 121 | player := global.GloInstance.GetPlayer(int32(userId)) 122 | if player != nil { 123 | p := player.(*user.Player) 124 | p.DestoryPlayer() 125 | } 126 | return 0 127 | 128 | } 129 | 130 | func BroadCast(args []string) int32 { 131 | global.GloInstance.BroadCast() 132 | return 0 133 | } 134 | 135 | func KillServer(args []string) int32 { 136 | close(Server.Done) 137 | return 1 138 | } 139 | 140 | func Command() { 141 | Help(nil) 142 | r := bufio.NewReader(os.Stdin) 143 | handlers := GetCommandHandlers() 144 | for { 145 | fmt.Print("Command > ") 146 | b, _, _ := r.ReadLine() 147 | line := string(b) 148 | 149 | tokens := strings.Split(line, " ") 150 | 151 | if handler, ok := handlers[tokens[0]]; ok { 152 | ret := handler(tokens) 153 | if ret != 0 { 154 | break 155 | } 156 | } else { 157 | fmt.Println("", tokens[0]) 158 | } 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /server/network/packet.go: -------------------------------------------------------------------------------- 1 | package network 2 | 3 | import ( 4 | "io" 5 | "fmt" 6 | "encoding/binary" 7 | "github.com/gogo/protobuf/proto" 8 | "slg_game_server/server/game/user" 9 | proto3 "slg_game_server/proto" 10 | "net" 11 | ) 12 | 13 | // 包头4个字节 14 | const ( 15 | CMDSIZE = 4 // 消息ID 2个字节 16 | BODYSIZE = 2 // 包体大小 2个字节 17 | TEMPSIZE = 2 // 预留2个字节 18 | ) 19 | 20 | 21 | // 接收Length-Type-Value格式的封包流程 22 | func RecvLTVPacket(reader net.Conn) (cmd proto3.ProtoCmd, tempId uint16, msg proto.Message, err error) { 23 | // 8个字节缓冲区 24 | headBuff := make([]byte, CMDSIZE + BODYSIZE + TEMPSIZE) 25 | _, err = io.ReadFull(reader, headBuff) 26 | if err != nil { 27 | fmt.Println("------------------err ", err) 28 | return // 这里并非跳出循环,而是返回值 29 | } 30 | 31 | // 先读取2字节的消息id 32 | msgId := int32(binary.LittleEndian.Uint32(headBuff[0:CMDSIZE])) 33 | // 分配包体缓冲区,再读取2字节的包体长度 34 | bodyLen := binary.LittleEndian.Uint16(headBuff[CMDSIZE:]) 35 | // 分配包体缓冲区,再读取2字节的预留id 36 | tempId = binary.LittleEndian.Uint16(headBuff[CMDSIZE + BODYSIZE:]) 37 | 38 | // 分配包体大小 39 | body := make([]byte, bodyLen) 40 | _, err = io.ReadFull(reader, body) 41 | 42 | if err != nil { 43 | //reader.Close() // client disconnect 44 | fmt.Println("------------------client error ", err) 45 | return 46 | } 47 | 48 | // 最终获取消息体内容 49 | cmd = proto3.ProtoCmd(msgId) 50 | pbData := user.Handler.GetPbData(cmd) 51 | msg = reflect.New(reflect.TypeOf(pbData).Elem()).Interface() 52 | proto.Unmarshal(body, msg.(proto.Message)) 53 | 54 | return cmd, tempId, pbData, nil 55 | } 56 | 57 | // 发送Length-Type-Value格式的封包流程 58 | func SendLTVPacket(writer net.Conn, cmd proto3.ProtoCmd, pbData proto.Message) error { 59 | msgData, _ := proto.Marshal(pbData) 60 | pkt := make([]byte, CMDSIZE + BODYSIZE + TEMPSIZE + len(msgData)) 61 | 62 | binary.LittleEndian.PutUint32(pkt, uint32(cmd)) 63 | binary.LittleEndian.PutUint16(pkt[CMDSIZE:], uint16(len(msgData))) 64 | binary.LittleEndian.PutUint16(pkt[CMDSIZE + BODYSIZE:], uint16(255)) 65 | 66 | copy(pkt[CMDSIZE + BODYSIZE + TEMPSIZE:], msgData) 67 | writer.Write(pkt) 68 | fmt.Println("send success") 69 | 70 | return nil 71 | } 72 | -------------------------------------------------------------------------------- /server/network/tcp_server.go: -------------------------------------------------------------------------------- 1 | package network 2 | 3 | import ( 4 | "fmt" 5 | "net" 6 | "runtime/debug" 7 | "slg_game_server/server/db" 8 | "slg_game_server/server/game/rank" 9 | proto3 "slg_game_server/proto" 10 | "slg_game_server/server/game/user" 11 | "slg_game_server/server/global" 12 | ) 13 | 14 | var Server ServerType 15 | 16 | type ServerType struct { 17 | command bool 18 | clientNum int 19 | Done chan struct{} 20 | } 21 | 22 | type client struct { 23 | readClose bool 24 | login int 25 | socket net.Conn 26 | userPid chan interface{} 27 | } 28 | 29 | func init() { 30 | // create listener 31 | listener, err := net.Listen("tcp", "127.0.0.1:8005") 32 | defer listener.Close() 33 | db.NewIncrease() 34 | global.NewGlobalPlayers() 35 | rank.NewRank() 36 | 37 | if err != nil{ 38 | fmt.Println("Error listening", err.Error()) 39 | return 40 | } 41 | 42 | //listen and receive client's connection 43 | go func() { 44 | for { 45 | conn, err := listener.Accept() 46 | fmt.Println("------------------ first accept", conn) 47 | if err != nil { 48 | fmt.Println("Error accepting", err.Error()) 49 | continue 50 | } 51 | Server.clientNum += 1 52 | client := &client{socket:conn} 53 | client.handleServer(conn) // 是否需要开协程 54 | //conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3))) // TODO need heartbeat && player timer 55 | } 56 | }() 57 | 58 | Server.Done = make(chan struct{}) 59 | if !Server.command { 60 | Command() 61 | } 62 | 63 | <- Server.Done 64 | fmt.Println("close server !!!") 65 | 66 | } 67 | 68 | func (c *client)handleServer(conn net.Conn) { 69 | writeChan := make(chan interface{}, 1024) 70 | fmt.Println("------------------ handleServer") 71 | go c.readServer(conn, writeChan) 72 | go c.writeServer(conn, writeChan) // 是否创建玩家成功后才开这个协程 73 | 74 | } 75 | 76 | // RecvLTVPacket 阻塞式读,所以不会一直死循环,有数据才循环 77 | // 通过read的标志位来退出阻塞式循环 78 | func (c *client) readServer(conn net.Conn, writeChan chan interface{}) { 79 | for { 80 | // TODO try-catch 81 | defer func(){ // 必须要先声明defer,否则不能捕获到panic异常 82 | fmt.Println("c") 83 | if err := recover(); err!=nil { 84 | fmt.Println("done^^^&&&%%$$$$########### err = ", err) // 这里的err其实就是panic传入的内容,55 85 | debug.PrintStack() 86 | } 87 | }() 88 | 89 | //if c.readClose { // 这个分支永远进不来,因为RecvLTVPacket是在阻塞式接收 90 | // return 91 | //} 92 | 93 | 94 | cmd, _, pbData, err := RecvLTVPacket(conn) 95 | if err != nil{ 96 | if c.readClose { // 服务器踢人最后一步就是conn关闭socket后,通知读协程退出 97 | fmt.Println("--------------- kickplayer close = ") 98 | }else { // 客户端主动断开socket 99 | fmt.Println("--------------- client disconnect = ") 100 | c.close() 101 | } 102 | return 103 | } 104 | 105 | if pbData == nil { 106 | c.close() 107 | return 108 | } 109 | 110 | if c.login == 0 { // first login 111 | fmt.Println("--------c.login") 112 | player := user.NewPlayer() 113 | player.SetWriteChan(writeChan) 114 | c.login = 1 115 | c.userPid = player.PidChan 116 | } 117 | // 异步向玩家协程发送消息 118 | c.userPid <- &user.Message{Cmd:cmd, PbData:pbData} 119 | } 120 | } 121 | 122 | // writeChan 阻塞式读,所以不会一直死循环,有数据才循环 123 | func (c *client) writeServer(conn net.Conn, writeChan chan interface{}) { 124 | for { 125 | msgData, ok := <- writeChan 126 | if !ok { 127 | fmt.Println("--------------- writeChan close = ", msgData) 128 | c.readClose = true 129 | conn.Close() // 通知read协程退出 130 | return 131 | } 132 | if msgData != nil { 133 | switch msg := msgData.(type) { 134 | case *user.Message: 135 | SendLTVPacket(conn, msg.Cmd, msg.PbData) 136 | default: 137 | 138 | } 139 | } 140 | fmt.Println("write") 141 | } 142 | } 143 | 144 | // 没有数据过来就会一直打印default 145 | //func (c *client) writeServer(conn net.Conn, writeChan chan interface{}) { 146 | // for { 147 | // select { 148 | // case msgData, ok := <- writeChan: 149 | // if !ok { 150 | // fmt.Println("--------------- writeChan close = ", msgData) 151 | // c.readClose = true 152 | // return 153 | // } 154 | // if msgData != nil { 155 | // switch msg := msgData.(type) { 156 | // case *user.Message: 157 | // SendLTVPacket(conn, int32(msg.Cmd), msg.PbData) 158 | // default: 159 | // 160 | // } 161 | // } 162 | // default: 163 | // fmt.Println("wirite", c.readClose) 164 | // 165 | // } 166 | // } 167 | //} 168 | 169 | func (c *client) close() { 170 | c.userPid <- &user.Message{Cmd:1003, PbData:&proto3.LogOutReq{}} // TODO call 171 | fmt.Println("client call close!!! ") 172 | <- c.userPid 173 | c.socket.Close() 174 | Server.clientNum -= 1 175 | } 176 | -------------------------------------------------------------------------------- /server/util/error.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | func CheckErr(err error) { 4 | if err != nil { 5 | panic(err) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /server/util/example_test.go: -------------------------------------------------------------------------------- 1 | package util_test 2 | 3 | import ( 4 | "fmt" 5 | "github.com/name5566/leaf/util" 6 | ) 7 | 8 | func ExampleMap() { 9 | m := new(util.Map) 10 | 11 | fmt.Println(m.Get("key")) 12 | m.Set("key", "value") 13 | fmt.Println(m.Get("key")) 14 | m.Del("key") 15 | fmt.Println(m.Get("key")) 16 | 17 | m.Set(1, "1") 18 | m.Set(2, 2) 19 | m.Set("3", 3) 20 | 21 | fmt.Println(m.Len()) 22 | 23 | // Output: 24 | // 25 | // value 26 | // 27 | // 3 28 | } 29 | 30 | func ExampleRandGroup() { 31 | i := util.RandGroup(0, 0, 50, 50) 32 | switch i { 33 | case 2, 3: 34 | fmt.Println("ok") 35 | } 36 | 37 | // Output: 38 | // ok 39 | } 40 | 41 | func ExampleRandInterval() { 42 | v := util.RandInterval(-1, 1) 43 | switch v { 44 | case -1, 0, 1: 45 | fmt.Println("ok") 46 | } 47 | 48 | // Output: 49 | // ok 50 | } 51 | 52 | func ExampleRandIntervalN() { 53 | r := util.RandIntervalN(-1, 0, 2) 54 | if r[0] == -1 && r[1] == 0 || 55 | r[0] == 0 && r[1] == -1 { 56 | fmt.Println("ok") 57 | } 58 | 59 | // Output: 60 | // ok 61 | } 62 | 63 | func ExampleDeepCopy() { 64 | src := []int{1, 2, 3} 65 | 66 | var dst []int 67 | util.DeepCopy(&dst, &src) 68 | 69 | for _, v := range dst { 70 | fmt.Println(v) 71 | } 72 | 73 | // Output: 74 | // 1 75 | // 2 76 | // 3 77 | } 78 | 79 | func ExampleDeepClone() { 80 | src := []int{1, 2, 3} 81 | 82 | dst := util.DeepClone(src).([]int) 83 | 84 | for _, v := range dst { 85 | fmt.Println(v) 86 | } 87 | 88 | // Output: 89 | // 1 90 | // 2 91 | // 3 92 | } 93 | -------------------------------------------------------------------------------- /server/util/map.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "sync" 5 | ) 6 | 7 | type Map struct { 8 | sync.RWMutex 9 | m map[interface{}]interface{} 10 | } 11 | 12 | func (m *Map) init() { 13 | if m.m == nil { 14 | m.m = make(map[interface{}]interface{}) 15 | } 16 | } 17 | 18 | func (m *Map) UnsafeGet(key interface{}) interface{} { 19 | if m.m == nil { 20 | return nil 21 | } else { 22 | return m.m[key] 23 | } 24 | } 25 | 26 | func (m *Map) Get(key interface{}) interface{} { 27 | m.RLock() 28 | defer m.RUnlock() 29 | return m.UnsafeGet(key) 30 | } 31 | 32 | func (m *Map) UnsafeSet(key interface{}, value interface{}) { 33 | m.init() 34 | m.m[key] = value 35 | } 36 | 37 | func (m *Map) Set(key interface{}, value interface{}) { 38 | m.Lock() 39 | defer m.Unlock() 40 | m.UnsafeSet(key, value) 41 | } 42 | 43 | func (m *Map) TestAndSet(key interface{}, value interface{}) interface{} { 44 | m.Lock() 45 | defer m.Unlock() 46 | 47 | m.init() 48 | 49 | if v, ok := m.m[key]; ok { 50 | return v 51 | } else { 52 | m.m[key] = value 53 | return nil 54 | } 55 | } 56 | 57 | func (m *Map) UnsafeDel(key interface{}) { 58 | m.init() 59 | delete(m.m, key) 60 | } 61 | 62 | func (m *Map) Del(key interface{}) { 63 | m.Lock() 64 | defer m.Unlock() 65 | m.UnsafeDel(key) 66 | } 67 | 68 | func (m *Map) UnsafeLen() int { 69 | if m.m == nil { 70 | return 0 71 | } else { 72 | return len(m.m) 73 | } 74 | } 75 | 76 | func (m *Map) Len() int { 77 | m.RLock() 78 | defer m.RUnlock() 79 | return m.UnsafeLen() 80 | } 81 | 82 | func (m *Map) UnsafeRange(f func(interface{}, interface{})) { 83 | if m.m == nil { 84 | return 85 | } 86 | for k, v := range m.m { 87 | f(k, v) 88 | } 89 | } 90 | 91 | func (m *Map) RLockRange(f func(interface{}, interface{})) { 92 | m.RLock() 93 | defer m.RUnlock() 94 | m.UnsafeRange(f) 95 | } 96 | 97 | func (m *Map) LockRange(f func(interface{}, interface{})) { 98 | m.Lock() 99 | defer m.Unlock() 100 | m.UnsafeRange(f) 101 | } 102 | -------------------------------------------------------------------------------- /server/util/rand.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "math/rand" 5 | "time" 6 | ) 7 | 8 | func init() { 9 | rand.Seed(time.Now().UnixNano()) 10 | } 11 | 12 | func RandGroup(p ...uint32) int { 13 | if p == nil { 14 | panic("args not found") 15 | } 16 | 17 | r := make([]uint32, len(p)) 18 | for i := 0; i < len(p); i++ { 19 | if i == 0 { 20 | r[0] = p[0] 21 | } else { 22 | r[i] = r[i-1] + p[i] 23 | } 24 | } 25 | 26 | rl := r[len(r)-1] 27 | if rl == 0 { 28 | return 0 29 | } 30 | 31 | rn := uint32(rand.Int63n(int64(rl))) 32 | for i := 0; i < len(r); i++ { 33 | if rn < r[i] { 34 | return i 35 | } 36 | } 37 | 38 | panic("bug") 39 | } 40 | 41 | func RandInterval(b1, b2 int32) int32 { 42 | if b1 == b2 { 43 | return b1 44 | } 45 | 46 | min, max := int64(b1), int64(b2) 47 | if min > max { 48 | min, max = max, min 49 | } 50 | return int32(rand.Int63n(max-min+1) + min) 51 | } 52 | 53 | func RandIntervalN(b1, b2 int32, n uint32) []int32 { 54 | if b1 == b2 { 55 | return []int32{b1} 56 | } 57 | 58 | min, max := int64(b1), int64(b2) 59 | if min > max { 60 | min, max = max, min 61 | } 62 | l := max - min + 1 63 | if int64(n) > l { 64 | n = uint32(l) 65 | } 66 | 67 | r := make([]int32, n) 68 | m := make(map[int32]int32) 69 | for i := uint32(0); i < n; i++ { 70 | v := int32(rand.Int63n(l) + min) 71 | 72 | if mv, ok := m[v]; ok { 73 | r[i] = mv 74 | } else { 75 | r[i] = v 76 | } 77 | 78 | lv := int32(l - 1 + min) 79 | if v != lv { 80 | if mv, ok := m[lv]; ok { 81 | m[v] = mv 82 | } else { 83 | m[v] = lv 84 | } 85 | } 86 | 87 | l-- 88 | } 89 | 90 | return r 91 | } 92 | -------------------------------------------------------------------------------- /sql/game.sql: -------------------------------------------------------------------------------- 1 | 2 | DROP TABLE IF EXISTS `t_user`; 3 | CREATE TABLE `t_user` ( 4 | `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '玩家ID', 5 | `acct_name` varchar(25) NOT NULL DEFAULT '' COMMENT '账号名字', 6 | `lord_name` varchar(25) NOT NULL DEFAULT '' COMMENT '玩家领主名', 7 | `sign` varchar(100) NOT NULL DEFAULT '' COMMENT '签名', 8 | `x` int(11) NOT NULL DEFAULT '0' COMMENT '出生点X坐标', 9 | `y` int(11) NOT NULL DEFAULT '0' COMMENT '出生点y坐标', 10 | `country` int(11) NOT NULL DEFAULT '0' COMMENT '所属国家', 11 | `level` int(11) NOT NULL DEFAULT '1' COMMENT '等级', 12 | `exp` int(11) NOT NULL DEFAULT '0' COMMENT '经验', 13 | `wood` int(11) NOT NULL DEFAULT '0' COMMENT '木材', 14 | `iron` int(11) NOT NULL DEFAULT '0' COMMENT '铁矿', 15 | `stone` int(11) NOT NULL DEFAULT '0' COMMENT '石料', 16 | `forage` int(11) NOT NULL DEFAULT '0' COMMENT '粮草', 17 | `gold` int(11) NOT NULL DEFAULT '0' COMMENT '金币', 18 | `diamond` int(11) NOT NULL DEFAULT '0' COMMENT '钻石', 19 | `bind_diamond` int(11) NOT NULL DEFAULT '0' COMMENT '绑定钻石', 20 | `decree` int(11) NOT NULL DEFAULT '0' COMMENT '政令', 21 | `army_order` int(11) NOT NULL DEFAULT '0' COMMENT '军令', 22 | `power` int(11) NOT NULL DEFAULT '0' COMMENT '势力值', 23 | `domain` int(11) NOT NULL DEFAULT '0' COMMENT '领地个数', 24 | PRIMARY KEY (`user_id`) 25 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; 26 | 27 | 28 | DROP TABLE IF EXISTS `t_user_mail`; 29 | CREATE TABLE `t_user_mail` ( 30 | `mail_id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '邮件id', 31 | `user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '对应的玩家ID', 32 | `get_flag` smallint(3) NOT NULL DEFAULT '0' COMMENT '领取标志位,0未领取,1已领取,2已删除', 33 | `type` smallint(3) NOT NULL DEFAULT '0' COMMENT '邮件类型', 34 | `time` int(11) NOT NULL DEFAULT '0' COMMENT '创建邮件时间戳', 35 | `title` text COMMENT '邮件标题', 36 | `context` text COMMENT '邮件内容', 37 | `data_info` text COMMENT '附件', 38 | PRIMARY KEY (`mail_id`) 39 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 40 | 41 | 42 | DROP TABLE IF EXISTS `t_user_task`; 43 | CREATE TABLE `t_user_task` ( 44 | `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '玩家ID', 45 | `task_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '任务ID', 46 | `type` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '任务类型', 47 | `sub_type` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '子类型', 48 | `target` text NOT NULL COMMENT '任务目标', 49 | `task_state` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '任务状态', 50 | `other_data` varchar(50) DEFAULT NULL, 51 | PRIMARY KEY (`user_id`,`task_id`) 52 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 53 | -------------------------------------------------------------------------------- /test/a/ta.go: -------------------------------------------------------------------------------- 1 | package a 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | type A struct { 8 | } 9 | 10 | func (a A) PrintA() { 11 | fmt.Println("aaaa0") 12 | } 13 | 14 | func NewA() *A { 15 | a := new(A) 16 | return a 17 | } -------------------------------------------------------------------------------- /test/b/tb.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "slg_game_server/test/i" 6 | "slg_game_server/test/a" 7 | ) 8 | 9 | type B struct { 10 | } 11 | 12 | func (b B) PrintA() { 13 | fmt.Println("bbbbbbbb") 14 | } 15 | 16 | func NewB() *B { 17 | b := new(B) 18 | return b 19 | } 20 | 21 | func RequireA(o i.Interfa) { 22 | o.PrintA() 23 | } 24 | 25 | func main() { 26 | var obj i.Interfa 27 | obj = a.NewA() 28 | RequireA(obj) 29 | 30 | } 31 | -------------------------------------------------------------------------------- /test/channelTest.go: -------------------------------------------------------------------------------- 1 | 2 | package main 3 | 4 | import ( 5 | "fmt" 6 | "sync" 7 | ) 8 | 9 | var waitgroup sync.WaitGroup 10 | 11 | func function(i int) { 12 | fmt.Println(i) 13 | waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1) 14 | } 15 | 16 | func main() { 17 | for i := 0; i < 10; i++ { 18 | //每创建一个goroutine,就把任务队列中任务的数量+1 19 | waitgroup.Add(1) 20 | go function(i) 21 | } 22 | //这里会发生阻塞,直到队列中所有的任务结束就会解除阻塞 23 | waitgroup.Wait() 24 | fmt.Println("over") 25 | } -------------------------------------------------------------------------------- /test/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "net" 5 | "fmt" 6 | "github.com/gogo/protobuf/proto" 7 | proto3 "slg_game_server/proto" 8 | "encoding/binary" 9 | "time" 10 | ) 11 | 12 | // 包头4个字节 13 | const ( 14 | CMDSIZE = 4 // 消息ID 2个字节 15 | BODYSIZE = 2 // 包体大小 2个字节 16 | TEMPSIZE = 2 // 预留2个字节 17 | ) 18 | 19 | 20 | func main() { 21 | conn, err := net.Dial("tcp", "127.0.0.1:8005") 22 | fmt.Println("----------- client start !!!") 23 | if err != nil{ 24 | fmt.Println("Error dialing", err.Error()) 25 | return 26 | } 27 | 28 | cmd := proto3.ProtoCmd_CMD_LoginReq 29 | pbData := &proto3.LoginReq{} 30 | pbData.AcctName = "hb13" 31 | 32 | SendLTVPacket(conn, cmd, pbData) 33 | 34 | cmd = proto3.ProtoCmd_CMD_ShowRankReq 35 | pbData1 := &proto3.ShowRankReq{Key:proto3.RankEnum_Rank_Power} 36 | SendLTVPacket(conn, cmd, pbData1) 37 | 38 | time.Sleep(time.Second*1500) 39 | //// 40 | //SendLTVPacket(conn, cmd, pbData) 41 | // 42 | //time.Sleep(time.Second*3) 43 | // 44 | //SendLTVPacket(conn, cmd, pbData) 45 | // 46 | //time.Sleep(time.Second*3) 47 | // 48 | //SendLTVPacket(conn, cmd, pbData) 49 | // 50 | //time.Sleep(time.Second*3) 51 | // 52 | //SendLTVPacket(conn, cmd, pbData) 53 | // 54 | //cmd1 := int32(proto3.ProtoCmd_CMD_LogoutReq) 55 | //pbData1 := &proto3.LogOutReq{} 56 | // 57 | //SendLTVPacket(conn, cmd1, pbData1) 58 | 59 | 60 | 61 | //for { 62 | // SendLTVPacket(conn, cmd, pbData) 63 | //} 64 | // 65 | // 66 | //time.Sleep(time.Second*2) 67 | // 68 | //SendLTVPacket(conn, cmd, pbData) 69 | 70 | 71 | } 72 | 73 | func SendLTVPacket(writer net.Conn, cmd proto3.ProtoCmd, pbData proto.Message) error { 74 | msgData, _ := proto.Marshal(pbData) 75 | pkt := make([]byte, CMDSIZE + BODYSIZE + TEMPSIZE + len(msgData)) 76 | 77 | binary.LittleEndian.PutUint32(pkt, uint32(cmd)) 78 | binary.LittleEndian.PutUint16(pkt[CMDSIZE:], uint16(len(msgData))) 79 | binary.LittleEndian.PutUint16(pkt[CMDSIZE + BODYSIZE:], uint16(255)) 80 | 81 | copy(pkt[CMDSIZE + BODYSIZE + TEMPSIZE:], msgData) 82 | writer.Write(pkt) 83 | fmt.Println("send success") 84 | 85 | return nil 86 | } 87 | -------------------------------------------------------------------------------- /test/closechan.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | ) 7 | 8 | func openhandler(ch chan int) { 9 | for { 10 | fmt.Println("1") 11 | a, ok := <- ch 12 | fmt.Println("ok = ", ok) 13 | select { 14 | case <-ch: 15 | fmt.Println("2222222222222222") 16 | return 17 | default: 18 | fmt.Println("3333") 19 | } 20 | 21 | fmt.Println("3444", a) 22 | } 23 | } 24 | 25 | func main() { 26 | c := make(chan int, 1024) 27 | go openhandler(c) 28 | time.Sleep(1e9) 29 | //close(c) 30 | //fmt.Println(IsClosed(c)) // true 31 | } -------------------------------------------------------------------------------- /test/code.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | type abc struct { 8 | a int 9 | } 10 | 11 | func main() { 12 | a := make(map[interface{}]interface{}) 13 | a[1] = 2 14 | //fmt.Println(a[1]) 15 | 16 | fmt.Println(new(abc)) 17 | fmt.Println(abc{}) 18 | } 19 | -------------------------------------------------------------------------------- /test/contex.go: -------------------------------------------------------------------------------- 1 | 2 | package main 3 | 4 | import ( 5 | "context" 6 | "fmt" 7 | "time" 8 | ) 9 | 10 | func main() { 11 | ctx := context.Background() 12 | ctx, cancel := context.WithCancel(ctx) 13 | go Proc(ctx, 1) 14 | go Proc(ctx, 2) 15 | go Proc(ctx, 3) 16 | go Proc(ctx, 4) 17 | 18 | time.Sleep(time.Second / 10) 19 | cancel() 20 | 21 | time.Sleep(time.Second) 22 | } 23 | 24 | func Proc(ctx context.Context, n int) { 25 | for { 26 | select { 27 | case <-ctx.Done(): 28 | return 29 | default: 30 | fmt.Printf("Proc-%d ", n) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /test/doudizhu.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huang2287832/slg_game_server/9dc7f6763021ab69ad6b74fdf956cb644cb64201/test/doudizhu.xlsx -------------------------------------------------------------------------------- /test/exceltest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "github.com/tealeg/xlsx" 7 | "strings" 8 | ) 9 | 10 | func main() { 11 | excelFileName := "./doudizhu.xlsx" 12 | xlFile, err := xlsx.OpenFile(excelFileName) 13 | if err != nil { 14 | fmt.Println("config is wrong!!!") 15 | panic(err) 16 | } 17 | 18 | path := "../config/doudizhu.go" 19 | file, error := os.Create(path) 20 | defer file.Close() 21 | if error != nil { 22 | fmt.Println(error) 23 | } 24 | 25 | pkg := "config" 26 | obj := "Doudizhu" 27 | 28 | dataStruct := fmt.Sprintf("package %s\n\n", pkg) 29 | dataStruct += fmt.Sprintf("type %s struct{\n ", obj) 30 | 31 | row0 := xlFile.Sheets[0].Rows[0] 32 | row2 := xlFile.Sheets[0].Rows[2] 33 | 34 | var s string 35 | var dataType string 36 | for index, cell := range row0.Cells { 37 | fmt.Println(row2.Cells[index].String()) 38 | fmt.Println("------------- ", row2.Cells[0].String()) 39 | 40 | switch row2.Cells[index].String() { 41 | 42 | case "INT": 43 | dataType = " int" 44 | case "STRING": 45 | dataType = " string" 46 | case "TERM": 47 | dataType = " []int" 48 | 49 | } 50 | s = s + cell.String() + dataType + "\n " 51 | } 52 | 53 | //file.WriteString(dataStruct + s + "\n}") 54 | 55 | key := "int" 56 | dataFunc := fmt.Sprintf("func Get_attr(key %s) *%s {\n", key, obj) 57 | dataFunc1 := dataStruct + s + "\n}\n\n" + dataFunc 58 | 59 | var msgdata string 60 | x := xlFile.Sheets[0] 61 | for k, v := range xlFile.Sheets[0].Rows[3:] { 62 | fmt.Println("-----------------k", k, v.Cells) 63 | var s2 string 64 | for index, cell := range v.Cells { 65 | array := cell.String() 66 | fmt.Println("----index", index) 67 | switch row2.Cells[index].String() { 68 | case "STRING": 69 | //c := "2" 70 | array = fmt.Sprintf("%q", array) //TODO 71 | case "TERM": 72 | array = strings.Replace(array, "[", "{", -1) 73 | array = strings.Replace(array, "]", "}", -1) 74 | array = fmt.Sprintf("[]int%s", array) 75 | 76 | } 77 | s2 += fmt.Sprintf("%s:%s, ", x.Rows[0].Cells[index].String(), array) 78 | } 79 | fmt.Println("----------------s2", s2) 80 | 81 | msg := fmt.Sprintf(" return &%s{%s} \n", obj, s2) 82 | 83 | msgdata += fmt.Sprintf(" \n if key == %s {\n %s \n }", v.Cells[0].String(), msg) 84 | 85 | //data += s2 86 | } 87 | 88 | data := dataFunc1 + msgdata + "\n return nil \n} " 89 | 90 | file.WriteString(data) 91 | 92 | } 93 | -------------------------------------------------------------------------------- /test/i/tc.go: -------------------------------------------------------------------------------- 1 | package i 2 | 3 | type Interfa interface { 4 | PrintA() 5 | } 6 | -------------------------------------------------------------------------------- /test/interface.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | // 定义接口类型 PeopleGetter 包含获取基本信息的方法 6 | type PeopleGetter interface { 7 | GetName() string 8 | GetAge() int 9 | } 10 | 11 | // 定义接口类型 EmployeeGetter 包含获取薪水的方法 12 | // EmployeeGetter 接口中嵌入了 PeopleGetter 接口,前者将获取后者的所有方法 13 | type EmployeeGetter interface { 14 | PeopleGetter 15 | GetSalary() int 16 | Help() 17 | } 18 | 19 | // 定义结构 Employee 20 | type Employee struct { 21 | name string 22 | age int 23 | salary int 24 | gender string 25 | } 26 | 27 | // 定义结构 Employee 的方法 28 | func (self *Employee) GetName() string { 29 | return self.name 30 | } 31 | 32 | func (self *Employee) GetAge() int { 33 | return self.age 34 | } 35 | 36 | func (self *Employee) GetSalary() int { 37 | return self.salary 38 | } 39 | 40 | func (self *Employee) Help() { 41 | fmt.Println("This is help info.", self.age) 42 | } 43 | 44 | // 匿名接口可以被用作变量或者结构属性类型 45 | type Man struct { 46 | gender interface { 47 | GetGender() string 48 | } 49 | } 50 | 51 | func (self *Employee) GetGender() string { 52 | return self.gender 53 | } 54 | 55 | // 定义执行回调函数的接口 56 | type Callbacker interface { 57 | Execute() 58 | } 59 | 60 | // 定义函数类型 func() 的新类型 CallbackFunc 61 | type CallbackFunc func() 62 | 63 | // 实现 CallbackFunc 的 Execute() 方法 64 | func (self CallbackFunc) Execute() { self() } 65 | 66 | func main() { 67 | // 空接口的使用,空接口类型的变量可以保存任何类型的值 68 | // 空格口类型的变量非常类似于弱类型语言中的变量 69 | var varEmptyInterface interface{} 70 | fmt.Printf("varEmptyInterface is of type %T\n", varEmptyInterface) 71 | varEmptyInterface = 100 72 | fmt.Printf("varEmptyInterface is of type %T\n", varEmptyInterface) 73 | varEmptyInterface = "Golang" 74 | fmt.Printf("varEmptyInterface is of type %T\n", varEmptyInterface) 75 | 76 | // Employee 实现了 PeopleGetter 和 EmployeeGetter 两个接口 77 | varEmployee := Employee{ 78 | name: "Jack Ma", 79 | age: 50, 80 | salary: 100000000, 81 | gender: "Male", 82 | } 83 | fmt.Println("varEmployee is: ", varEmployee) 84 | varEmployee.Help() 85 | fmt.Println("varEmployee.name = ", varEmployee.GetName()) 86 | fmt.Println("varEmployee.age = ", varEmployee.GetAge()) 87 | fmt.Println("varEmployee.salary = ", varEmployee.GetSalary()) 88 | 89 | // 匿名接口对象的使用 90 | varMan := Man{&Employee{ 91 | name: "Nobody", 92 | age: 20, 93 | salary: 10000, 94 | gender: "Unknown", 95 | }} 96 | fmt.Println("The gender of Nobody is: ", varMan.gender.GetGender()) 97 | 98 | // 接口类型转换,从超集到子集的转换是可以的 99 | // 从方法集的子集到超集的转换会导致编译错误 100 | // 这种情况下 switch 不支持 fallthrough 101 | var varEmpInter EmployeeGetter = &varEmployee 102 | switch varEmpInter.(type) { 103 | case nil: 104 | fmt.Println("nil") 105 | case PeopleGetter: 106 | fmt.Println("PeopleGetter") 107 | default: 108 | fmt.Println("Unknown") 109 | } 110 | 111 | // 使用 “执行回调函数的接口对象” 执行回调函数 112 | // 这种做法的优势是函数显式地 “实现” 特定接口 113 | varCallbacker := CallbackFunc(func() { println("I am a callback function.") }) 114 | varCallbacker.Execute() 115 | 116 | } -------------------------------------------------------------------------------- /test/interface2.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | type Animal interface { 6 | Speak() string 7 | } 8 | 9 | type Cat struct { 10 | 11 | } 12 | 13 | func (c Cat) Speak() string { 14 | return "cat" 15 | } 16 | 17 | type Dog struct { 18 | 19 | } 20 | 21 | func (d Dog) Speak() string { 22 | return "dog" 23 | } 24 | 25 | func Test(params interface{}) { 26 | fmt.Println(params) 27 | } 28 | 29 | func main() { 30 | animals := []Animal{Cat{}, Dog{}} 31 | for _, animal := range animals { 32 | fmt.Println(animal.Speak()) 33 | } 34 | b := &Cat{} 35 | a := b.Speak() 36 | fmt.Println("-------------a = ", a) 37 | Test("string") 38 | Test(123) 39 | Test(true) 40 | } -------------------------------------------------------------------------------- /test/interfaceTest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | //type gameObject struct { 4 | // name string 5 | //} 6 | // 7 | //type player struct { 8 | // gameObject 9 | //} 10 | // 11 | //func (p *player) Name() string { 12 | // return p.name 13 | //} 14 | 15 | type challenger interface { 16 | Name() string 17 | Attack() interface{} 18 | } 19 | 20 | func main() { 21 | a := challenger.Name 22 | println("=----------------a = ", a) 23 | } 24 | -------------------------------------------------------------------------------- /test/interfaceTest2.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | type SalaryCalculator interface { 6 | CalculateSalary() int 7 | } 8 | 9 | type Contract struct { 10 | empId int 11 | basicpay int 12 | } 13 | 14 | type Permanent struct { 15 | empId int 16 | basicpay int 17 | jj int 18 | } 19 | 20 | func (p Permanent) CalculateSalary() int { 21 | return p.basicpay + p.jj 22 | } 23 | 24 | func (c Contract) CalculateSalary() int { 25 | return c.basicpay 26 | } 27 | 28 | func totalExpense(s []SalaryCalculator) { 29 | expense := 0 30 | for _, v := range s { 31 | expense = expense + v.CalculateSalary() 32 | } 33 | fmt.Printf("total buddget $%d", expense) 34 | } 35 | 36 | 37 | func main() { 38 | pemp1 := Permanent{1, 3000, 10000} 39 | pemp2 := Permanent{2, 3000, 20000} 40 | cemp1 := Contract{3, 3000} 41 | employees := []SalaryCalculator{pemp1, pemp2, cemp1} 42 | totalExpense(employees) 43 | 44 | } 45 | -------------------------------------------------------------------------------- /test/intest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | type CallBack interface { 6 | getName() string 7 | BaseCall 8 | } 9 | 10 | type BaseCall interface { 11 | doSomething() 12 | } 13 | 14 | func (user User) doSomething() { 15 | fmt.Println("do something") 16 | } 17 | 18 | type User struct { 19 | name string 20 | age int 21 | } 22 | 23 | func (user User) getName() string { 24 | return user.name 25 | } 26 | 27 | func main() { 28 | user := User{name:"hb"} 29 | user.doSomething() 30 | a := CallBack(user) 31 | fmt.Println(a) 32 | } 33 | -------------------------------------------------------------------------------- /test/kk.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | func main() { 4 | var a int 5 | a = change(&a) 6 | println(a) 7 | } 8 | 9 | func change(a *int) int { 10 | return *a + 3 11 | } 12 | -------------------------------------------------------------------------------- /test/lock.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | ) 7 | 8 | //func main() { 9 | // var mutex sync.Mutex 10 | // fmt.Println("Lock the lock") 11 | // mutex.Lock() 12 | // fmt.Println("The lock is locked") 13 | // channels := make([]chan int, 4) 14 | // for i := 0; i < 4; i++ { 15 | // channels[i] = make(chan int) 16 | // go func(i int, c chan int) { 17 | // fmt.Println("Not lock: ", i) 18 | // mutex.Lock() 19 | // fmt.Println("Locked: ", i) 20 | // time.Sleep(time.Second) 21 | // fmt.Println("Unlock the lock0: ", i) 22 | // mutex.Unlock() 23 | // c <- i 24 | // }(i, channels[i]) 25 | // } 26 | // time.Sleep(time.Second) 27 | // fmt.Println("Unlock the lock") 28 | // mutex.Unlock() 29 | // time.Sleep(time.Second) 30 | // 31 | // for _, c := range channels { 32 | // <-c 33 | // } 34 | //} 35 | 36 | //func main() { 37 | // var mutex sync.Mutex 38 | // fmt.Println("Lock the lock. (G0)") 39 | // mutex.Lock() 40 | // fmt.Println("The lock is locked. (G0)") 41 | // for i := 1; i <= 3; i++ { 42 | // go func(i int) { 43 | // fmt.Printf("Lock the lock. (G%d)\n", i) 44 | // mutex.Lock() 45 | // fmt.Printf("The lock is locked. (G%d)\n", i) 46 | // mutex.Unlock() 47 | // }(i) 48 | // } 49 | // time.Sleep(time.Second) 50 | // fmt.Println("Unlock the lock. (G0)") 51 | // mutex.Unlock() 52 | // fmt.Println("The lock is unlocked. (G0)") 53 | // time.Sleep(time.Second) 54 | //} 55 | 56 | 57 | func print(i int) { 58 | fmt.Println("Hello world ", i) 59 | } 60 | 61 | func main() { 62 | for i := 0; i < 10; i++ { 63 | go print(i) 64 | } 65 | time.Sleep(time.Second) 66 | } 67 | 68 | //func main() { 69 | // for i := 1; i <= 100; i++ { 70 | // go func(i int) { 71 | // fmt.Printf("Lock the lock. (G%d)\n", i) 72 | // }(i) 73 | // } 74 | // time.Sleep(time.Second) 75 | // fmt.Println("Unlock the lock. (G0)") 76 | // time.Sleep(time.Second) 77 | //} -------------------------------------------------------------------------------- /test/maptest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | ) 7 | 8 | func main() { 9 | 10 | m := map[string]int{"a":1, "b":2, "c":3, "d":4, "e":5, "f":6} 11 | 12 | fmt.Println(m) 13 | fmt.Println("-------") 14 | 15 | wg := &sync.WaitGroup{} 16 | wg.Add(3) 17 | go func(p map[string]int) { 18 | 19 | defer wg.Done() 20 | p["a"] = 10 21 | 22 | }(m) //因为go语言中的map为引用类型, 虽然go语言函数以传值方式调用,即函数持有的为参数副本,但因是引用类型, 故依然指向映射m , 类似c的指针. 23 | go func(p map[string]int) { 24 | 25 | defer wg.Done() 26 | p["a"] = 14 27 | 28 | }(m) 29 | go func(p map[string]int) { 30 | 31 | defer wg.Done() 32 | p["a"] = 12 33 | 34 | }(m) 35 | 36 | wg.Wait() 37 | 38 | fmt.Println(m) 39 | } -------------------------------------------------------------------------------- /test/methodTest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | //在编程语言中,方法和函数的概念需要搞清楚。函数指的是一个封装的代码块,我们可以直接调用它,并返回结果。 6 | //而方法其实也是一种函数,只不过方法需要和某个对象绑定。Golang并没有类的概念,不过仍然有方法和接口这些概念。 7 | type ICar interface { 8 | beep() 9 | } 10 | 11 | func main() { 12 | Method() 13 | fmt.Println("---------------- method = ", car1.id) 14 | } -------------------------------------------------------------------------------- /test/mysqltest2.go: -------------------------------------------------------------------------------- 1 | //数据库连接池测试 2 | package main 3 | 4 | import ( 5 | "database/sql" 6 | "fmt" 7 | _ "github.com/go-sql-driver/mysql" 8 | "log" 9 | "net/http" 10 | ) 11 | 12 | var db *sql.DB 13 | 14 | func init() { 15 | db, _ := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/game") 16 | //db, _ = sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8") 17 | db.SetMaxOpenConns(200) 18 | db.SetMaxIdleConns(100) 19 | db.Ping() 20 | } 21 | 22 | func main() { 23 | //startHttpServer() 24 | } 25 | 26 | func startHttpServer() { 27 | http.HandleFunc("/pool", pool) 28 | err := http.ListenAndServe(":9090", nil) 29 | if err != nil { 30 | log.Fatal("ListenAndServe: ", err) 31 | } 32 | } 33 | 34 | func pool(w http.ResponseWriter, r *http.Request) { 35 | rows, err := db.Query("SELECT * FROM user limit 1") 36 | defer rows.Close() 37 | checkErr(err) 38 | 39 | columns, _ := rows.Columns() 40 | scanArgs := make([]interface{}, len(columns)) 41 | values := make([]interface{}, len(columns)) 42 | for j := range values { 43 | scanArgs[j] = &values[j] 44 | } 45 | 46 | record := make(map[string]string) 47 | for rows.Next() { 48 | //将行数据保存到record字典 49 | err = rows.Scan(scanArgs...) 50 | for i, col := range values { 51 | if col != nil { 52 | record[columns[i]] = string(col.([]byte)) 53 | } 54 | } 55 | } 56 | 57 | fmt.Println(record) 58 | fmt.Fprintln(w, "finish") 59 | } 60 | 61 | func checkErr(err error) { 62 | if err != nil { 63 | fmt.Println(err) 64 | panic(err) 65 | } 66 | } -------------------------------------------------------------------------------- /test/mysqtest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "slg_game_server/server/db" 6 | ) 7 | 8 | func main() { 9 | //db.CheckNewUser("hb") 10 | } 11 | -------------------------------------------------------------------------------- /test/objsort.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "sort" 5 | "fmt" 6 | ) 7 | type person struct { 8 | Name string 9 | Age int 10 | } 11 | 12 | type personSlice []person 13 | 14 | func (s personSlice) Len() int { return len(s) } 15 | func (s personSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } 16 | func (s personSlice) Less(i, j int) bool { return s[i].Age > s[j].Age } 17 | 18 | func main() { 19 | a := personSlice { 20 | { 21 | Name: "AAA", 22 | Age: 55, 23 | }, 24 | { 25 | Name: "BBB", 26 | Age: 22, 27 | }, 28 | { 29 | Name: "CCC", 30 | Age: 0, 31 | }, 32 | { 33 | Name: "DDD", 34 | Age: 22, 35 | }, 36 | { 37 | Name: "EEE", 38 | Age: 11, 39 | }, 40 | } 41 | sort.Sort(a) 42 | fmt.Println(a) 43 | } -------------------------------------------------------------------------------- /test/pointTest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | //golang的指针receiver和非指针receiver的区别? 6 | // 7 | //最大的区别应该是指针传递的是对像的引用,这样在方法里操作的时候可以动态修改对像的属性值。 8 | // 9 | //非指针传递的是对像的拷贝。 10 | 11 | //eg: 12 | //-record(Person, { 13 | // Name, 14 | // Age 15 | //}) 16 | //eg: 17 | // #r_user{Name = "hb", Age = 18} 18 | 19 | type Person struct { 20 | Name string 21 | Age int 22 | } 23 | 24 | func (p *Person) SayHi1() { 25 | p.Name = "leon1" 26 | 27 | } 28 | 29 | func (p Person) SayHi2() { 30 | p.Name = "leon2" 31 | 32 | } 33 | 34 | func main() { 35 | p1 := &Person{Name: "test", Age: 10} 36 | fmt.Printf("p1t = %T\n", &Person{Name: "test", Age: 10}) 37 | fmt.Printf("p2t = %T\n", Person{Name: "test", Age: 10}) 38 | fmt.Println("name1 : " + p1.Name) 39 | p1.SayHi1() 40 | fmt.Println("name2 : " + p1.Name) 41 | 42 | p2 := Person{Name: "test1", Age: 11} 43 | fmt.Println("name3: " + p2.Name) 44 | p2.SayHi2() 45 | fmt.Println("name4 : " + p2.Name) 46 | 47 | 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /test/publish_subscribe.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | "sync" 7 | "time" 8 | ) 9 | 10 | type ( 11 | subscriber chan interface{} //订阅者为一个管道 12 | topicFunc func(v interface{}) bool //主题为一个过滤器 13 | ) 14 | 15 | //发布者对象 16 | type Publisher struct { 17 | m sync.RWMutex //读写锁 18 | buffer int //订阅队列的缓存大小 19 | timeout time.Duration //发布超时时间 20 | subscribers map[subscriber]topicFunc //订阅者信息 21 | } 22 | 23 | //构建一个发布者对象,可以设置发布超时时间和缓存队列的长度 24 | func NewPublisher(publishTimeout time.Duration, buffer int) *Publisher { 25 | return &Publisher{ 26 | buffer: buffer, 27 | timeout: publishTimeout, 28 | subscribers: make(map[subscriber]topicFunc), 29 | } 30 | } 31 | 32 | //添加一个新的订阅者,订阅过滤器筛选后的主题 33 | func (p *Publisher) SubscribeTopic(topic topicFunc) chan interface{} { 34 | ch := make(chan interface{}, p.buffer) 35 | p.m.Lock() 36 | p.subscribers[ch] = topic 37 | p.m.Unlock() 38 | return ch 39 | } 40 | 41 | //添加一个新的订阅者,订阅全部主题 42 | func (p *Publisher) Subscribe() chan interface{} { 43 | return p.SubscribeTopic(nil) 44 | } 45 | 46 | // 退出订阅 47 | func (p *Publisher) Evict(sub chan interface{}) { 48 | p.m.Lock() 49 | defer p.m.Unlock() 50 | 51 | delete(p.subscribers, sub) 52 | close(sub) 53 | } 54 | 55 | //发布一个主题 56 | func (p *Publisher) Publish(v interface{}) { 57 | p.m.RLock() 58 | defer p.m.RUnlock() 59 | 60 | var wg sync.WaitGroup 61 | for sub, topic := range p.subscribers { 62 | wg.Add(1) 63 | go p.sendTopic(sub, topic, v, &wg) 64 | } 65 | wg.Wait() 66 | } 67 | 68 | //关闭发布者对象,同时关闭所有的订阅者管道 69 | func (p *Publisher) Close() { 70 | p.m.Lock() 71 | defer p.m.Unlock() 72 | 73 | for sub := range p.subscribers { 74 | delete(p.subscribers, sub) 75 | close(sub) 76 | } 77 | } 78 | 79 | //发送主题,可以容忍一定的超时 80 | func (p *Publisher) sendTopic(sub subscriber, topic topicFunc, v interface{}, wg *sync.WaitGroup) { 81 | defer wg.Done() 82 | if topic != nil && !topic(v) { 83 | return 84 | } 85 | 86 | select { 87 | case sub <- v: 88 | case <-time.After(p.timeout): 89 | } 90 | } 91 | 92 | func main() { 93 | p := NewPublisher(100*time.Millisecond, 10) 94 | defer p.Close() 95 | 96 | all := p.Subscribe() 97 | golang := p.SubscribeTopic(func(v interface{}) bool { 98 | if s, ok := v.(string); ok { 99 | return strings.Contains(s, "golang") 100 | } 101 | return false 102 | }) 103 | 104 | p.Publish("hello, world") 105 | p.Publish("hello, golang") 106 | 107 | go func(ch <-chan interface{}) { 108 | for msg := range ch { 109 | fmt.Println("All:", msg) 110 | } 111 | }(all) 112 | 113 | go func(ch <-chan interface{}) { 114 | for msg := range ch { 115 | fmt.Println("golang:", msg) 116 | } 117 | }(golang) 118 | 119 | //运行一定时间后退出 120 | time.Sleep(3 * time.Second) 121 | } 122 | -------------------------------------------------------------------------------- /test/recover.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | func main() { 8 | 9 | defer func(){ // 必须要先声明defer,否则不能捕获到panic异常 10 | if err := recover(); err!=nil { 11 | fmt.Println(err) // 这里的err其实就是panic传入的内容,55 12 | //debug.PrintStack() 13 | } 14 | }() 15 | 16 | 17 | 18 | 19 | //index := 4 20 | //ia := [3]int{1,2,3} 21 | //_ = ia[index] 22 | 23 | 24 | panic("12345") 25 | } 26 | -------------------------------------------------------------------------------- /test/refecttest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "reflect" 6 | ) 7 | 8 | type MyStruct struct { 9 | name string 10 | } 11 | 12 | func (this *MyStruct) GetName() string { 13 | return this.name 14 | } 15 | 16 | func main() { 17 | a := new(MyStruct) 18 | a.name = "yejianfeng" 19 | fmt.Println(reflect.TypeOf(a)) 20 | fmt.Println("-------------------", reflect.ValueOf(a).Elem().FieldByName("name")) 21 | a1 := reflect.TypeOf(a).Elem().Name() 22 | fmt.Printf("-------------------%T \n", a1) 23 | var b MyStruct 24 | b.name = "abc" 25 | fmt.Println(reflect.TypeOf(b)) 26 | fmt.Println(reflect.ValueOf(b).FieldByName("name")) 27 | } -------------------------------------------------------------------------------- /test/selecttest.go: -------------------------------------------------------------------------------- 1 | package main 2 | import "fmt" 3 | import "time" 4 | 5 | func f1(ch chan int) { 6 | time.Sleep(time.Second * 1) 7 | ch <- 1 8 | } 9 | func f2(ch chan int) { 10 | time.Sleep(time.Second * 2) 11 | ch <- 1 12 | } 13 | func main() { 14 | var ch1 = make(chan int) 15 | var ch2 = make(chan int) 16 | go f1(ch1) 17 | go f2(ch2) 18 | 19 | //for { 20 | // select { 21 | // case a := <-ch1: 22 | // fmt.Println("The first case is selected.", a) 23 | // case b := <-ch2: 24 | // fmt.Println("The second case is selected.", b) 25 | // 26 | // default: 27 | // //fmt.Println("The 3 case is selected.") 28 | // } 29 | //} 30 | 31 | //select { 32 | //case <-ch1: 33 | // fmt.Println("The first case is selected.") 34 | //case <-ch2: 35 | // fmt.Println("The second case is selected.") 36 | //} 37 | 38 | //go func() { 39 | // for { 40 | // fmt.Println("looping") 41 | // } 42 | //}() 43 | 44 | select { 45 | case a := <-ch1: 46 | fmt.Println("The first case is selected.", a) 47 | case b := <-ch2: 48 | fmt.Println("The second case is selected.", b) 49 | 50 | //default: 51 | // fmt.Println("The 3 case is selected.") 52 | } 53 | fmt.Println("The 4 case is selected.") 54 | } -------------------------------------------------------------------------------- /test/slicetest.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | func main() { 7 | var a []int 8 | a = append(a, 333) 9 | for index, value := range a[:len(a)]{ 10 | fmt.Println(index, value) 11 | } 12 | fmt.Println(a) 13 | 14 | //var v []int 15 | ////v = make([]int, 1, 1) 16 | //v[0] = 2 17 | //fmt.Println(v) 18 | 19 | //l := list.New() 20 | //l.PushBack(4) 21 | //l.PushBack(5) 22 | //l.PushBack(6) 23 | //l.PushBack(7) 24 | //l.PushBack(17) 25 | //l.PushBack(27) 26 | ////l.Remove(6) 27 | //fmt.Println(l.Len()) 28 | 29 | b := []int{1,2,3,4} 30 | for k, v := range b[1:3] { 31 | 32 | fmt.Println("---------a[] ", k) 33 | fmt.Println("---------v", v) 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /test/sort.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "sort" 5 | "fmt" 6 | ) 7 | 8 | func main() { 9 | intList := [] int {2, 4, 3, 5, 7, 6, 9, 8, 1, 0} 10 | float8List := [] float64 {4.2, 5, 12.3, 10.0, 50.4, 99.9, 31.4, 27.81828, 3.14} 11 | stringList := [] string {"a", "c", "b", "d", "f", "i", "z", "x", "w", "y"} 12 | 13 | sort.Ints(intList) 14 | sort.Float64s(float8List) 15 | sort.Strings(stringList) 16 | 17 | sort.Reverse(sort.IntSlice(intList)) 18 | fmt.Printf("%v\n%v\n%v\n", intList, float8List, stringList) 19 | 20 | } -------------------------------------------------------------------------------- /test/syncMap.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | ) 7 | 8 | type userInfo struct { 9 | Name string 10 | Age int 11 | } 12 | 13 | var m sync.Map 14 | 15 | func main() { 16 | 17 | vv, ok := m.LoadOrStore("1", "one") 18 | fmt.Println(vv, ok) //one false 19 | 20 | vv, ok = m.Load("1") 21 | fmt.Println(vv, ok) //one true 22 | 23 | vv, ok = m.LoadOrStore("1", "oneone") 24 | fmt.Println(vv, ok) //one true 25 | 26 | vv, ok = m.Load("1") 27 | fmt.Println(vv, ok) //one true 28 | 29 | m.Store("1", "oneone") 30 | vv, ok = m.Load("1") 31 | fmt.Println(vv, ok) // oneone true 32 | 33 | m.Store("2", "two") 34 | m.Range(func(k, v interface{}) bool { 35 | fmt.Println("--------0", k, v) 36 | return true 37 | }) 38 | 39 | m.Delete("1") 40 | m.Range(func(k, v interface{}) bool { 41 | fmt.Println("--------1", k, v) 42 | return true 43 | }) 44 | 45 | map1 := make(map[string]userInfo) 46 | var user1 userInfo 47 | user1.Name = "ChamPly" 48 | user1.Age = 24 49 | map1["user1"] = user1 50 | 51 | var user2 userInfo 52 | user2.Name = "Tom" 53 | user2.Age = 18 54 | m.Store("map_test", map1) 55 | 56 | mapValue, _ := m.Load("map_test") 57 | 58 | for k, v := range mapValue.(interface{}).(map[string]userInfo) { 59 | fmt.Println(k, v) 60 | fmt.Println("name:", v.Name) 61 | } 62 | } -------------------------------------------------------------------------------- /test/templete.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | ) 7 | 8 | func main() { 9 | 10 | type person struct { 11 | Id int 12 | Name string 13 | Country string 14 | } 15 | 16 | liumiaocn := person{Id: 1001, Name: "liumiaocn", Country: "China"} 17 | 18 | fmt.Println("liumiaocn = ", liumiaocn) 19 | 20 | tmpl := template.New("tmpl1") 21 | tmpl.Parse("Hello {{.Name}} Welcome to go programming...\n") 22 | tmpl.Execute(os.Stdout, liumiaocn) 23 | 24 | } 25 | -------------------------------------------------------------------------------- /test/test1.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "database/sql" 5 | "fmt" 6 | _ "github.com/go-sql-driver/mysql" 7 | ) 8 | 9 | type DbWorker struct { 10 | Dsn string 11 | Db *sql.DB 12 | UserInfo userTB 13 | } 14 | type userTB struct { 15 | Id int 16 | Name sql.NullString 17 | Age sql.NullInt64 18 | } 19 | 20 | func main() { 21 | var err error 22 | dbw := DbWorker{ 23 | Dsn: "root:123456@tcp(127.0.0.1:3306)/game", 24 | } 25 | dbw.Db, err = sql.Open("mysql", dbw.Dsn) 26 | if err != nil { 27 | panic(err) 28 | return 29 | } 30 | defer dbw.Db.Close() 31 | 32 | dbw.insertData() 33 | dbw.queryData() 34 | } 35 | 36 | func (dbw *DbWorker) insertData() { 37 | stmt, _ := dbw.Db.Prepare(`INSERT INTO user (name, age) VALUES (?, ?)`) 38 | defer stmt.Close() 39 | 40 | ret, err := stmt.Exec("xys", 23) 41 | if err != nil { 42 | fmt.Printf("insert data error: %v\n", err) 43 | return 44 | } 45 | if LastInsertId, err := ret.LastInsertId(); nil == err { 46 | fmt.Println("LastInsertId:", LastInsertId) 47 | } 48 | if RowsAffected, err := ret.RowsAffected(); nil == err { 49 | fmt.Println("RowsAffected:", RowsAffected) 50 | } 51 | } 52 | 53 | func (dbw *DbWorker) queryDataPre() { 54 | dbw.UserInfo = userTB{} 55 | } 56 | func (dbw *DbWorker) queryData() { 57 | stmt, _ := dbw.Db.Prepare(`SELECT * From user where age >= ? AND age < ?`) 58 | defer stmt.Close() 59 | 60 | dbw.queryDataPre() 61 | 62 | rows, err := stmt.Query(20, 30) 63 | defer rows.Close() 64 | if err != nil { 65 | fmt.Printf("insert data error: %v\n", err) 66 | return 67 | } 68 | for rows.Next() { 69 | rows.Scan(&dbw.UserInfo.Id, &dbw.UserInfo.Name, &dbw.UserInfo.Age) 70 | if err != nil { 71 | fmt.Printf(err.Error()) 72 | continue 73 | } 74 | if !dbw.UserInfo.Name.Valid { 75 | dbw.UserInfo.Name.String = "" 76 | } 77 | if !dbw.UserInfo.Age.Valid { 78 | dbw.UserInfo.Age.Int64 = 0 79 | } 80 | fmt.Println("get data, id: ", dbw.UserInfo.Id, " name: ", dbw.UserInfo.Name.String, " age: ", int(dbw.UserInfo.Age.Int64)) 81 | } 82 | 83 | err = rows.Err() 84 | if err != nil { 85 | fmt.Printf(err.Error()) 86 | } 87 | } -------------------------------------------------------------------------------- /test/testclient.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "net" 5 | "fmt" 6 | proto3 "slg_game_server/proto" 7 | "slg_game_server/server/handler" 8 | ) 9 | 10 | func Error_print(err error) { 11 | fmt.Println("------------------err ", err) 12 | } 13 | 14 | func main() { 15 | tcpAddress, err := net.ResolveTCPAddr("tcp4", "192.168.60.130:8004") 16 | if err != nil { 17 | Error_print(err) 18 | } 19 | conn, err := net.DialTCP("tcp", nil, tcpAddress) 20 | if err != nil { 21 | Error_print(err) 22 | } 23 | writeChan := make(chan []byte, 1024) 24 | readChan := make(chan []byte, 1024) 25 | go writeConnection1(conn, writeChan) 26 | go readConnection1(conn, readChan) 27 | //go handleReadChannel(readChan) 28 | for { 29 | var s string 30 | fmt.Scan(&s) 31 | writeChan <- []byte(s) 32 | } 33 | } 34 | func readConnection1(conn *net.TCPConn, channel chan []byte) { 35 | defer conn.Close() 36 | buffer := make([]byte, 2048) 37 | for { 38 | n, err := conn.Read(buffer) 39 | if err != nil { 40 | Error_print(err) 41 | return 42 | } 43 | println("Received from:", conn.RemoteAddr(), string(buffer[:n])) // 44 | channel <- buffer[:n] 45 | } 46 | } 47 | 48 | func writeConnection1(conn *net.TCPConn, channel chan []byte) { 49 | defer conn.Close() 50 | for { 51 | select { 52 | case data := <-channel: 53 | switch data { 54 | case "login": 55 | 56 | 57 | } 58 | cmd := int32(proto3.CMD_CMD_LoginReq) 59 | pbData := &proto3.LoginReq{} 60 | pbData.GameId = 666 61 | pbData.Token = "hb" 62 | handler.SendLTVPacket(conn, cmd, pbData) 63 | _, err := conn.Write(data) 64 | if err != nil { 65 | Error_print(err) 66 | } 67 | println("Write to:", conn.RemoteAddr(), string(data)) } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /test/testserver.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "net" 5 | "fmt" 6 | ) 7 | 8 | var client_num int = 0 9 | 10 | func Error_print1(err error) { 11 | fmt.Println("------------------err ", err) 12 | } 13 | 14 | func main() { 15 | l, err := net.Listen("tcp4", "127.0.0.1:8006") 16 | if err != nil { 17 | Error_print1(err) 18 | } 19 | defer l.Close() 20 | for { 21 | conn, err := l.Accept() 22 | if err != nil { 23 | Error_print1(err) 24 | continue 25 | } 26 | client_num++ 27 | fmt.Printf("A new Connection %d.\n", client_num) 28 | go handlerConnection(conn) 29 | } 30 | } 31 | func handlerConnection(conn net.Conn) { 32 | defer closeConnection(conn) 33 | readChannel := make(chan []byte, 1024) 34 | writeChannel := make(chan []byte, 1024) 35 | go readConnection(conn, readChannel) 36 | go writeConnection(conn, writeChannel) 37 | for { 38 | select { 39 | case data := <-readChannel: 40 | if string(data) == "bye" { 41 | return 42 | } 43 | writeChannel <- append([]byte("Back"), data...) } 44 | } 45 | } 46 | func writeConnection(conn net.Conn, channel chan []byte) { 47 | for { 48 | select { 49 | case data := <-channel: 50 | println("Write:", conn.RemoteAddr().String(), string(data)) 51 | _, err := conn.Write(data) 52 | if err != nil { 53 | Error_print1(err) 54 | return 55 | } } 56 | } 57 | } 58 | func readConnection(conn net.Conn, channel chan []byte) { 59 | buffer := make([]byte, 2048) 60 | for { 61 | n, err := conn.Read(buffer) 62 | if err != nil { 63 | Error_print1(err) 64 | channel <- []byte("bye") //这里须要进一步改进! 65 | break 66 | } 67 | println("Recei:", conn.RemoteAddr().String(), string(buffer[:n])) 68 | channel <- buffer[:n] 69 | } 70 | } 71 | func closeConnection(conn net.Conn) { 72 | conn.Close() 73 | client_num-- 74 | fmt.Printf("Now, %d connections is alve.\n", client_num) 75 | } 76 | -------------------------------------------------------------------------------- /test/utilsort.go: -------------------------------------------------------------------------------- 1 | package main 2 | import ( 3 | "fmt" 4 | "sort" 5 | ) 6 | type Tom struct { 7 | Name string 8 | Age int 9 | } 10 | type Persons []Tom 11 | 12 | // Len()方法和Swap()方法不用变化 13 | // 获取此 slice 的长度 14 | func (p Persons) Len() int { return len(p) } 15 | 16 | // 交换数据 17 | func (p Persons) Swap(i, j int) { p[i], p[j] = p[j], p[i] } 18 | 19 | // 嵌套结构体 将继承 Person 的所有属性和方法 20 | // 所以相当于SortByName 也实现了 Len() 和 Swap() 方法 21 | type SortByName struct{ Persons } 22 | 23 | // 根据元素的姓名长度降序排序 (此处按照自己的业务逻辑写) 24 | func (p SortByName) Less(i, j int) bool { 25 | return len(p.Persons[i].Name) > len(p.Persons[j].Name) 26 | } 27 | 28 | type SortByAge struct{ Persons } 29 | // 根据元素的年龄降序排序 (此处按照自己的业务逻辑写) 30 | 31 | func (p SortByAge) Less(i, j int) bool { 32 | return p.Persons[i].Age > p.Persons[j].Age 33 | } 34 | 35 | func main() { 36 | persons := Persons{ 37 | { 38 | Name: "test123", 39 | Age: 20, 40 | }, 41 | { 42 | Name: "test1", 43 | Age: 22, 44 | }, 45 | { 46 | Name: "test12", 47 | Age: 21, 48 | }, 49 | } 50 | fmt.Println("排序前") 51 | for _, person := range persons { 52 | fmt.Println(person.Name, ":", person.Age) 53 | } 54 | sort.Sort(SortByName{persons}) 55 | fmt.Println("排序后") 56 | for _, person := range persons { 57 | fmt.Println(person.Name, ":", person.Age) 58 | } 59 | } --------------------------------------------------------------------------------