3.4 Zinx-V0.3代码实现

    zinx/znet/conneciont.go

    1. import (
    2. "fmt"
    3. "net"
    4. "zinx/ziface"
    5. )
    6. type Connection struct {
    7. //当前连接的socket TCP套接字
    8. Conn *net.TCPConn
    9. //当前连接的ID 也可以称作为SessionID,ID全局唯一
    10. ConnID uint32
    11. //当前连接的关闭状态
    12. isClosed bool
    13. //该连接的处理方法router
    14. Router ziface.IRouter
    15. //告知该链接已经退出/停止的channel
    16. ExitBuffChan chan bool
    17. }
    18. //创建连接的方法
    19. func NewConntion(conn *net.TCPConn, connID uint32, router ziface.IRouter) *Connection{
    20. c := &Connection{
    21. Conn: conn,
    22. ConnID: connID,
    23. isClosed: false,
    24. Router: router,
    25. ExitBuffChan: make(chan bool, 1),
    26. }
    27. return c
    28. }
    29. defer fmt.Println(c.RemoteAddr().String(), " conn reader exit!")
    30. defer c.Stop()
    31. for {
    32. //读取我们最大的数据到buf中
    33. buf := make([]byte, 512)
    34. _, err := c.Conn.Read(buf)
    35. if err != nil {
    36. fmt.Println("recv buf err ", err)
    37. c.ExitBuffChan <- true
    38. continue
    39. }
    40. //得到当前客户端请求的Request数据
    41. req := Request{
    42. conn:c,
    43. data:buf,
    44. }
    45. //从路由Routers 中找到注册绑定Conn的对应Handle
    46. go func (request ziface.IRequest) {
    47. //执行注册的路由方法
    48. c.Router.PreHandle(request)
    49. c.Router.Handle(request)
    50. c.Router.PostHandle(request)
    51. }(&req)
    52. }
    53. }
    54. //启动连接,让当前连接开始工作
    55. func (c *Connection) Start() {
    56. //开启处理该链接读取到客户端数据之后的请求业务
    57. go c.StartReader()
    58. for {
    59. select {
    60. case <- c.ExitBuffChan:
    61. }
    62. }
    63. }
    64. //停止连接,结束当前连接状态M
    65. func (c *Connection) Stop() {
    66. //1. 如果当前链接已经关闭
    67. if c.isClosed == true {
    68. return
    69. }
    70. c.isClosed = true
    71. //TODO Connection Stop() 如果用户注册了该链接的关闭回调业务,那么在此刻应该显示调用
    72. // 关闭socket链接
    73. c.Conn.Close()
    74. //通知从缓冲队列读数据的业务,该链接已经关闭
    75. c.ExitBuffChan <- true
    76. //关闭该链接全部管道
    77. close(c.ExitBuffChan)
    78. }
    79. //从当前连接获取原始的socket TCPConn
    80. func (c *Connection) GetTCPConnection() *net.TCPConn {
    81. return c.Conn
    82. }
    83. //获取当前连接ID
    84. func (c *Connection) GetConnID() uint32{
    85. return c.ConnID
    86. }
    87. //获取远程客户端地址信息
    88. func (c *Connection) RemoteAddr() net.Addr {