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中摘除。