Commit 54b3f1336ab7a89a93a2a12bae7ba99867afd465
1 parent
b3d79719
add connector interface
Showing
7 changed files
with
135 additions
and
49 deletions
 
Show diff stats
cmd/test/client.go
| 1 | 1 | package main | 
| 2 | 2 | |
| 3 | 3 | import ( | 
| 4 | - "bufio" | |
| 5 | - "bytes" | |
| 6 | - "encoding/binary" | |
| 7 | 4 | "github.com/golang/protobuf/proto" | 
| 8 | - "net" | |
| 5 | + "pro2d/common" | |
| 9 | 6 | "pro2d/common/components" | 
| 10 | 7 | "pro2d/common/logger" | 
| 11 | 8 | "pro2d/pb" | 
| ... | ... | @@ -27,49 +24,19 @@ func main() { | 
| 27 | 24 | } | 
| 28 | 25 | l, _ :=proto.Marshal(loginReq) | 
| 29 | 26 | |
| 30 | - b := components.PBMessage{ | |
| 31 | - Head: head, | |
| 32 | - Body: l, | |
| 27 | + options := []components.ConnectorOption{ | |
| 28 | + components.WithCtorCount(common.GlobalConf.TestClient.Count), | |
| 29 | + components.WithCtorSplitter(components.NewPBSplitter()), | |
| 33 | 30 | } | 
| 34 | - head.Length = uint32(16 + len(b.Body)) | |
| 35 | - buf := &bytes.Buffer{} | |
| 36 | - err := binary.Write(buf, binary.BigEndian, head) | |
| 37 | - if err != nil { | |
| 38 | - logger.Error("err: %v, head: %v", err, head) | |
| 39 | - return | |
| 40 | - } | |
| 41 | - logger.Debug("head: %v", head) | |
| 42 | 31 | |
| 43 | - err = binary.Write(buf, binary.BigEndian, b.Body) | |
| 44 | - if err != nil { | |
| 45 | - logger.Error("err: %v, msg: %v", err, b.Body) | |
| 46 | - return | |
| 47 | - } | |
| 48 | - | |
| 49 | - client, err := net.Dial("tcp", "localhost:8850") | |
| 50 | - if err != nil { | |
| 32 | + client := components.NewConnector(common.GlobalConf.TestClient.Ip, common.GlobalConf.TestClient.Port, options...) | |
| 33 | + if err := client.Connect(); err != nil { | |
| 51 | 34 | logger.Error(err) | 
| 52 | 35 | return | 
| 53 | 36 | } | 
| 54 | 37 | |
| 55 | - rd := bufio.NewReadWriter(bufio.NewReader(client), bufio.NewWriter(client)) | |
| 56 | 38 | for { | 
| 57 | - b1 := make([]byte, 1024) | |
| 58 | - n, err := rd.Write(buf.Bytes()) | |
| 59 | - if err != nil { | |
| 60 | - logger.Error(err) | |
| 61 | - return | |
| 62 | - } | |
| 63 | - rd.Flush() | |
| 64 | - logger.Debug("write:n: %d, msg: %s", n, buf.Bytes()) | |
| 65 | - | |
| 66 | - n, err = rd.Read(b1) | |
| 67 | - if err != nil { | |
| 68 | - logger.Error(err) | |
| 69 | - return | |
| 70 | - } | |
| 71 | - logger.Debug("recv: %s, n: %d\n", b1, n) | |
| 39 | + client.Send(head.Cmd, l) | |
| 72 | 40 | time.Sleep(1*time.Second) | 
| 73 | 41 | } | 
| 74 | - | |
| 75 | 42 | } | 
| 76 | 43 | \ No newline at end of file | ... | ... | 
common/components/conn.go
| ... | ... | @@ -14,7 +14,7 @@ import ( | 
| 14 | 14 | type Connection struct { | 
| 15 | 15 | IConnection | 
| 16 | 16 | net.Conn | 
| 17 | - Server IServer | |
| 17 | + splitter ISplitter | |
| 18 | 18 | Id uint32 | 
| 19 | 19 | |
| 20 | 20 | scanner *bufio.Scanner | 
| ... | ... | @@ -36,7 +36,7 @@ var connectionPool = &sync.Pool{ | 
| 36 | 36 | New: func() interface{} { return new(Connection)}, | 
| 37 | 37 | } | 
| 38 | 38 | |
| 39 | -func NewConn(id int, conn net.Conn, s IServer) *Connection { | |
| 39 | +func NewConn(id int, conn net.Conn, splitter ISplitter) IConnection { | |
| 40 | 40 | c := connectionPool.Get().(*Connection) | 
| 41 | 41 | closed := atomic.LoadUint32(&c.Status) | 
| 42 | 42 | if closed != 0 { | 
| ... | ... | @@ -46,7 +46,7 @@ func NewConn(id int, conn net.Conn, s IServer) *Connection { | 
| 46 | 46 | |
| 47 | 47 | atomic.StoreUint32(&c.Id, uint32(id)) | 
| 48 | 48 | c.Conn = conn | 
| 49 | - c.Server = s | |
| 49 | + c.splitter = splitter | |
| 50 | 50 | |
| 51 | 51 | c.scanner = bufio.NewScanner(conn) | 
| 52 | 52 | c.writer = bufio.NewWriter(conn) | 
| ... | ... | @@ -118,7 +118,7 @@ func (c *Connection) Stop() { | 
| 118 | 118 | } | 
| 119 | 119 | |
| 120 | 120 | func (c *Connection) Send(errCode int32, cmd uint32, data []byte) error { | 
| 121 | - buf, err := c.Server.GetSplitter().Pack(cmd, data, errCode, 0) | |
| 121 | + buf, err := c.splitter.Pack(cmd, data, errCode, 0) | |
| 122 | 122 | if err != nil { | 
| 123 | 123 | return err | 
| 124 | 124 | } | 
| ... | ... | @@ -171,10 +171,10 @@ func (c *Connection) read() { | 
| 171 | 171 | c.Stop() | 
| 172 | 172 | }() | 
| 173 | 173 | |
| 174 | - c.scanner.Split(c.Server.GetSplitter().ParseMsg) | |
| 174 | + c.scanner.Split(c.splitter.ParseMsg) | |
| 175 | 175 | |
| 176 | 176 | for c.scanner.Scan() { | 
| 177 | - req, err := c.Server.GetSplitter().UnPack(c.scanner.Bytes()) | |
| 177 | + req, err := c.splitter.UnPack(c.scanner.Bytes()) | |
| 178 | 178 | if err != nil { | 
| 179 | 179 | return | 
| 180 | 180 | } | ... | ... | 
| ... | ... | @@ -0,0 +1,100 @@ | 
| 1 | +package components | |
| 2 | + | |
| 3 | +import ( | |
| 4 | + "fmt" | |
| 5 | + "net" | |
| 6 | + "pro2d/common/logger" | |
| 7 | +) | |
| 8 | + | |
| 9 | +type ConnectorOption func(*Connector) | |
| 10 | + | |
| 11 | +func WithCtorSplitter(splitter ISplitter) ConnectorOption { | |
| 12 | + return func(connector *Connector) { | |
| 13 | + connector.splitter = splitter | |
| 14 | + } | |
| 15 | +} | |
| 16 | + | |
| 17 | +func WithCtorCount(count int) ConnectorOption { | |
| 18 | + return func(connector *Connector) { | |
| 19 | + connector.sum = count | |
| 20 | + } | |
| 21 | +} | |
| 22 | + | |
| 23 | +type Connector struct { | |
| 24 | + IConnector | |
| 25 | + IServer | |
| 26 | + splitter ISplitter | |
| 27 | + ip string | |
| 28 | + port int | |
| 29 | + sum int | |
| 30 | + | |
| 31 | + Conns IConnManage | |
| 32 | + ids uint32 | |
| 33 | +} | |
| 34 | + | |
| 35 | +func NewConnector(ip string, port int, options ...ConnectorOption) IConnector { | |
| 36 | + c := &Connector{ | |
| 37 | + ids: 0, | |
| 38 | + ip: ip, | |
| 39 | + port: port, | |
| 40 | + Conns: NewConnManage(), | |
| 41 | + } | |
| 42 | + for _, option := range options { | |
| 43 | + option(c) | |
| 44 | + } | |
| 45 | + return c | |
| 46 | +} | |
| 47 | + | |
| 48 | +func (c *Connector) Connect() error { | |
| 49 | + if c.sum == 0 { | |
| 50 | + c.sum = 1 | |
| 51 | + } | |
| 52 | + for i := 0; i < c.sum; i++ { | |
| 53 | + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d",c.ip, c.port)) | |
| 54 | + if err != nil { | |
| 55 | + return err | |
| 56 | + } | |
| 57 | + c.ids++ | |
| 58 | + cli := NewConn(int(c.ids), conn, c.splitter) | |
| 59 | + cli.SetConnectionCallback(c.OnConnect) | |
| 60 | + cli.SetMessageCallback(c.OnMessage) | |
| 61 | + cli.SetCloseCallback(c.OnClose) | |
| 62 | + cli.SetTimerCallback(c.OnTimer) | |
| 63 | + | |
| 64 | + cli.Start() | |
| 65 | + } | |
| 66 | + | |
| 67 | + return nil | |
| 68 | +} | |
| 69 | + | |
| 70 | +func (c *Connector) DisConnect(){ | |
| 71 | + c.Conns.StopAllConns() | |
| 72 | +} | |
| 73 | + | |
| 74 | +func (c *Connector) Send( cmd uint32, b []byte) { | |
| 75 | + c.Conns.Range(func(key interface{}, value interface{}) bool { | |
| 76 | + conn := value.(IConnection) | |
| 77 | + conn.Send(0, cmd ,b) | |
| 78 | + return true | |
| 79 | + }) | |
| 80 | +} | |
| 81 | + | |
| 82 | +func (c *Connector) GetSplitter() ISplitter { | |
| 83 | + return c.splitter | |
| 84 | +} | |
| 85 | + | |
| 86 | +func (c *Connector) OnConnect(conn IConnection){ | |
| 87 | + c.Conns.AddConn(conn.GetID(), conn) | |
| 88 | +} | |
| 89 | + | |
| 90 | +func (c *Connector) OnMessage(msg IMessage){ | |
| 91 | + logger.Debug("recv msg cmd: %d, conn: %d data: %s", msg.GetHeader().GetMsgID(), msg.GetSession().GetID(), msg.GetData()) | |
| 92 | +} | |
| 93 | + | |
| 94 | +func (c *Connector) OnClose(conn IConnection){ | |
| 95 | + logger.Debug("onclose id: %d", conn.GetID()) | |
| 96 | +} | |
| 97 | + | |
| 98 | +func (c *Connector) OnTimer(conn IConnection){ | |
| 99 | + logger.Debug("ontimer id: %d", conn.GetID()) | |
| 100 | +} | |
| 0 | 101 | \ No newline at end of file | ... | ... | 
common/components/icompontents.go
| ... | ... | @@ -13,7 +13,6 @@ type ( | 
| 13 | 13 | } | 
| 14 | 14 | //็ฝ็ปๅ | 
| 15 | 15 | IMessage interface { | 
| 16 | - IHead | |
| 17 | 16 | GetHeader() IHead //่ทๅๆถๆฏๅคด | 
| 18 | 17 | SetHeader(header IHead) //่ฎพ็ฝฎๆถๆฏๅคด | 
| 19 | 18 | |
| ... | ... | @@ -71,6 +70,14 @@ type ( | 
| 71 | 70 | SetTimerCallback(TimerCallback) | 
| 72 | 71 | } | 
| 73 | 72 | |
| 73 | + //Connector | |
| 74 | + IConnector interface { | |
| 75 | + Connect() error | |
| 76 | + DisConnect() | |
| 77 | + | |
| 78 | + Send(cmd uint32, b []byte) | |
| 79 | + } | |
| 80 | + | |
| 74 | 81 | //httpserver | 
| 75 | 82 | IHttp interface { | 
| 76 | 83 | Start() error | ... | ... | 
common/components/server.go
common/conf.go
| ... | ... | @@ -71,6 +71,12 @@ type LogConf struct { | 
| 71 | 71 | LogConn *LogConn `yaml:"Conn" json:"Conn"` | 
| 72 | 72 | } | 
| 73 | 73 | |
| 74 | +type TestClient struct { | |
| 75 | + Ip string `yaml:"ip"` | |
| 76 | + Port int`yaml:"port"` | |
| 77 | + Count int `yaml:"count"` | |
| 78 | +} | |
| 79 | + | |
| 74 | 80 | type ServerConf struct { | 
| 75 | 81 | ID string `yaml:"id"` | 
| 76 | 82 | Name string `yaml:"name"` | 
| ... | ... | @@ -80,6 +86,7 @@ type ServerConf struct { | 
| 80 | 86 | GameConf *SConf `yaml:"server_game"` | 
| 81 | 87 | RedisConf *RedisConf `yaml:"redis"` | 
| 82 | 88 | LogConf *LogConf `yaml:"logconf" json:"logconf"` | 
| 89 | + TestClient *TestClient `yaml:"test_client"` | |
| 83 | 90 | Etcd *Etcd `yaml:"etcd"` | 
| 84 | 91 | } | 
| 85 | 92 | ... | ... | 
conf/conf.yaml
| ... | ... | @@ -20,7 +20,7 @@ server_account: | 
| 20 | 20 | id: "1" | 
| 21 | 21 | name: "account" | 
| 22 | 22 | ip: "192.168.0.206" | 
| 23 | - port: 8858 | |
| 23 | + port: 8080 | |
| 24 | 24 | pool_size: 1 | 
| 25 | 25 | debugport: 6062 | 
| 26 | 26 | mongo: | 
| ... | ... | @@ -39,6 +39,11 @@ server_game: | 
| 39 | 39 | <<: *default-mongo | 
| 40 | 40 | dbname: "game" | 
| 41 | 41 | |
| 42 | +test_client: | |
| 43 | + ip: "127.0.0.1" | |
| 44 | + port: 8850 | |
| 45 | + count: 10 | |
| 46 | + | |
| 42 | 47 | logconf: | 
| 43 | 48 | TimeFormat: "2006-01-02 15:04:05" | 
| 44 | 49 | Console: | ... | ... |