Golang轻量级TCP服务器框架(九)—— TCP多客户端链接链接管理模块
原作者视频地址: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