9.1 创建链接管理模块

这里面我们就需要对链接有一个管理的模块.

我们在zifaceznet分别建立iconnmanager.goconnmanager.go文件

zinx/ziface/iconmanager.go

package ziface

/*
    连接管理抽象层
 */
type IConnManager interface {
    Add(conn IConnection)                   //添加链接
    Remove(conn IConnection)                //删除连接
    Get(connID uint32) (IConnection, error) //利用ConnID获取链接
    Len() int                               //获取当前连接
    ClearConn()                                //删除并停止所有链接
}

这里定义了一些接口方法,添加链接、删除链接、根据ID获取链接、链接数量、和清除链接等。

zinx/znet/connmanager.go

package znet

import (
    "errors"
    "fmt"
    "sync"
    "zinx/ziface"
)

/*
    连接管理模块
*/
type ConnManager struct {
    connections map[uint32]ziface.IConnection //管理的连接信息
    connLock    sync.RWMutex                  //读写连接的读写锁
}

/*
    创建一个链接管理
 */
func NewConnManager() *ConnManager {
    return &ConnManager{
        connections:make(map[uint32] ziface.IConnection),
    }
}

//添加链接
func (connMgr *ConnManager) Add(conn ziface.IConnection) {
    //保护共享资源Map 加写锁
    connMgr.connLock.Lock()
    defer connMgr.connLock.Unlock()

    //将conn连接添加到ConnMananger中
    connMgr.connections[conn.GetConnID()] = conn

    fmt.Println("connection add to ConnManager successfully: conn num = ", connMgr.Len())
}

//删除连接
func (connMgr *ConnManager) Remove(conn ziface.IConnection) {
    //保护共享资源Map 加写锁
    connMgr.connLock.Lock()
    defer connMgr.connLock.Unlock()

    //删除连接信息
    delete(connMgr.connections, conn.GetConnID())

    fmt.Println("connection Remove ConnID=",conn.GetConnID(), " successfully: conn num = ", connMgr.Len())
}

//利用ConnID获取链接
func (connMgr *ConnManager) Get(connID uint32) (ziface.IConnection, error) {
    //保护共享资源Map 加读锁
    connMgr.connLock.RLock()
    defer connMgr.connLock.RUnlock()

    if conn, ok := connMgr.connections[connID]; ok {
        return conn, nil
    } else {
        return nil, errors.New("connection not found")
    }
}

//获取当前连接
func (connMgr *ConnManager) Len() int {
    return len(connMgr.connections)
}

//清除并停止所有连接
func (connMgr *ConnManager) ClearConn() {
    //保护共享资源Map 加写锁
    connMgr.connLock.Lock()
    defer connMgr.connLock.Unlock()

    //停止并删除全部的连接信息
    for connID, conn := range connMgr.connections {
        //停止
        conn.Stop()
        //删除
        delete(connMgr.connections,connID)
    }


    fmt.Println("Clear All Connections successfully: conn num = ", connMgr.Len())
}

这里面ConnManager中,其中用一个map来承载全部的连接信息,key是连接ID,value则是连接本身。其中有一个读写锁connLock主要是针对map做多任务修改时的保护作用。

Remove()方法只是单纯的将conn从map中摘掉,而ClearConn()方法则会先停止链接业务,c.Stop(),然后再从map中摘除。

results matching ""

    No results matching ""