• 9.1 创建链接管理模块

    9.1 创建链接管理模块

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

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

    zinx/ziface/iconmanager.go

    1. package ziface
    2. /*
    3. 连接管理抽象层
    4. */
    5. type IConnManager interface {
    6. Add(conn IConnection) //添加链接
    7. Remove(conn IConnection) //删除连接
    8. Get(connID uint32) (IConnection, error) //利用ConnID获取链接
    9. Len() int //获取当前连接
    10. ClearConn() //删除并停止所有链接
    11. }

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

    zinx/znet/connmanager.go

    1. package znet
    2. import (
    3. "errors"
    4. "fmt"
    5. "sync"
    6. "zinx/ziface"
    7. )
    8. /*
    9. 连接管理模块
    10. */
    11. type ConnManager struct {
    12. connections map[uint32]ziface.IConnection //管理的连接信息
    13. connLock sync.RWMutex //读写连接的读写锁
    14. }
    15. /*
    16. 创建一个链接管理
    17. */
    18. func NewConnManager() *ConnManager {
    19. return &ConnManager{
    20. connections:make(map[uint32] ziface.IConnection),
    21. }
    22. }
    23. //添加链接
    24. func (connMgr *ConnManager) Add(conn ziface.IConnection) {
    25. //保护共享资源Map 加写锁
    26. connMgr.connLock.Lock()
    27. defer connMgr.connLock.Unlock()
    28. //将conn连接添加到ConnMananger中
    29. connMgr.connections[conn.GetConnID()] = conn
    30. fmt.Println("connection add to ConnManager successfully: conn num = ", connMgr.Len())
    31. }
    32. //删除连接
    33. func (connMgr *ConnManager) Remove(conn ziface.IConnection) {
    34. //保护共享资源Map 加写锁
    35. connMgr.connLock.Lock()
    36. defer connMgr.connLock.Unlock()
    37. //删除连接信息
    38. delete(connMgr.connections, conn.GetConnID())
    39. fmt.Println("connection Remove ConnID=",conn.GetConnID(), " successfully: conn num = ", connMgr.Len())
    40. }
    41. //利用ConnID获取链接
    42. func (connMgr *ConnManager) Get(connID uint32) (ziface.IConnection, error) {
    43. //保护共享资源Map 加读锁
    44. connMgr.connLock.RLock()
    45. defer connMgr.connLock.RUnlock()
    46. if conn, ok := connMgr.connections[connID]; ok {
    47. return conn, nil
    48. } else {
    49. return nil, errors.New("connection not found")
    50. }
    51. }
    52. //获取当前连接
    53. func (connMgr *ConnManager) Len() int {
    54. return len(connMgr.connections)
    55. }
    56. //清除并停止所有连接
    57. func (connMgr *ConnManager) ClearConn() {
    58. //保护共享资源Map 加写锁
    59. connMgr.connLock.Lock()
    60. defer connMgr.connLock.Unlock()
    61. //停止并删除全部的连接信息
    62. for connID, conn := range connMgr.connections {
    63. //停止
    64. conn.Stop()
    65. //删除
    66. delete(connMgr.connections,connID)
    67. }
    68. fmt.Println("Clear All Connections successfully: conn num = ", connMgr.Len())
    69. }

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

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