Commit 54b3f1336ab7a89a93a2a12bae7ba99867afd465

Authored by zhangqijia
1 parent b3d79719

add connector interface

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 }
... ...
common/components/connector.go 0 โ†’ 100644
... ... @@ -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
... ... @@ -130,7 +130,7 @@ func (s *Server) Start() error {
130 130 }
131 131  
132 132 id++
133   - client := NewConn(id, conn, s)
  133 + client := NewConn(id, conn, s.splitter)
134 134 s.newConnection(client)
135 135 }
136 136 }
... ...
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:
... ...