原作者视频地址:zinx-Golang轻量级TCP服务器框架
本人为自学整理的文档,梳理思考开发框架的基本思路,方法,以及视频中不理解的地方。
若想学习,强烈建议直接观看原作视频即可。
可在下方留言交流。

1.目的

为什么设置一个多客户端链接管理模块?

在该篇之前,所有的实验都是仅仅只有一个客户端连接服务器。
如果此时有N多个客户端链接进来的话。我们之前的链接就获取不到了,但是其开辟的协程还是存在的。
我们的server为了方便对这些客户端链接进行管理。
比如某个客户端,总没有信息过来、或者某个客户端总是发送恶意消息,我们就需要立即断开它。
再或者我们需要进行限流,控制客户端的数量等。

2.IConnmanager的接口设计
type IConnmanager interface {
	AddConn(conn IConnection)
	RemoveConn(conn IConnection)
	GetConn(connId uint32) (IConnection,error)
	Len() int
	ClearConn()
}

这里我们仅仅是设计了,几个简单的接口,如果你还需要其他功能,可以继续添加。

3.connmanager结构体的实现
type connmanager struct {
	connections map[uint32] ziface.IConnection
	connLock sync.Mutex
}

//创建当前连接的方法
func NewConnManager() *connmanager {
	return &connmanager{
		connections: make(map[uint32] ziface.IConnection),
	}
}

func (cm *connmanager) AddConn(conn ziface.IConnection) {
	cm.connLock.Lock()
	cm.connections[conn.GetConnID()] = conn
	cm.connLock.Unlock()
}
func (cm *connmanager) RemoveConn(conn ziface.IConnection) {
	cm.connLock.Lock()
	delete(cm.connections, conn.GetConnID())
	cm.connLock.Unlock()
}
func (cm *connmanager) GetConn(connId uint32) (ziface.IConnection,error) {
	cm.connLock.Lock()
	conn, ok := cm.connections[connId]
	if !ok {
		return nil,errors.New("conn is nothing")
	}
	cm.connLock.Unlock()
	return conn, nil
}
func (cm *connmanager) Len() int {
	cm.connLock.Lock()
	length := len(cm.connections)
	cm.connLock.Unlock()
	return length
}
func (cm *connmanager) ClearConn() {
	cm.connLock.Lock()
	for connID, conn := range cm.connections {
		conn.Stop()
		delete(cm.connections, connID)
	}
	cm.connLock.Unlock()
}

这里仅仅是对客户端链接管理的一些操作。上述提到的对客户端行为的检测,不属于此处的内容。

4.server的集成

该结构体肯定由server管理的,所以需要给server添加成员

type server struct {
	//服务器的名称
	name string
	//ip的版本
	ipVersion string
	//ip地址
	ip string
	//ip监听端口
	port int
	//路由
	msgHandler ziface.IMsgHandler
	//该server的客户端链接管理器
	connMgr ziface.IConnmanager    //客户端链接管理模块
}

server集成的代码这里就不再展示了,可以去看原作的github