connector.go 1.89 KB
package components

import (
	"fmt"
	"net"
	"pro2d/common/logger"
)

type ConnectorOption func(*Connector)

func WithCtorSplitter(splitter ISplitter) ConnectorOption {
	return func(connector *Connector) {
		connector.splitter = splitter
	}
}

func WithCtorCount(count int) ConnectorOption {
	return func(connector *Connector) {
		connector.sum = count
	}
}

type Connector struct {
	IConnector
	IServer
	splitter   ISplitter
	ip string
	port int
	sum int

	Conns IConnManage
	ids uint32
}

func NewConnector(ip string, port int, options ...ConnectorOption) IConnector {
	c := &Connector{
		ids: 0,
		ip:         ip,
		port:       port,
		Conns: NewConnManage(),
	}
	for _, option := range options {
		option(c)
	}
	return c
}

func (c *Connector) Connect() error {
	if c.sum == 0 {
		c.sum = 1
	}
	for i := 0; i < c.sum; i++ {
		conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d",c.ip, c.port))
		if err != nil {
			return err
		}
		c.ids++
		cli := NewConn(int(c.ids), conn, c.splitter)
		cli.SetConnectionCallback(c.OnConnect)
		cli.SetMessageCallback(c.OnMessage)
		cli.SetCloseCallback(c.OnClose)
		cli.SetTimerCallback(c.OnTimer)

		cli.Start()
	}

	return nil
}

func (c *Connector) DisConnect(){
	c.Conns.StopAllConns()
}

func (c *Connector) Send( cmd uint32, b []byte) {
	c.Conns.Range(func(key interface{}, value interface{}) bool {
		conn := value.(IConnection)
		conn.Send(0, cmd ,b)
		return true
	})
}

func (c *Connector) GetSplitter() ISplitter {
	return c.splitter
}

func (c *Connector) OnConnect(conn IConnection){
	c.Conns.AddConn(conn.GetID(), conn)
}

func (c *Connector) OnMessage(msg IMessage){
	logger.Debug("recv msg cmd: %d, conn: %d data: %s", msg.GetHeader().GetMsgID(), msg.GetSession().GetID(), msg.GetData())
}

func (c *Connector) OnClose(conn IConnection){
	logger.Debug("onclose id: %d", conn.GetID())
}

func (c *Connector) OnTimer(conn IConnection){
	logger.Debug("ontimer id: %d", conn.GetID())
}