<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #### 3.3 Zinx-V0.3-集成簡單路由功能 ##### A\) IServer增添路由添加功能 我們需要給IServer類,增加一個抽象方法`AddRouter`,目的也是讓Zinx框架使用者,可以自定一個Router處理業務方法。 zinx/ziface/irouter.go ```go package ziface //定義服務器接口 type IServer interface{ //啟動服務器方法 Start() //停止服務器方法 Stop() //開啟業務服務方法 Serve() //路由功能:給當前服務注冊一個路由業務方法,供客戶端鏈接處理使用 AddRouter(router IRouter) } ``` ##### B\) Server類增添Router成員 有了抽象的方法,自然Server就要實現,并且還要添加一個Router成員. zinx/znet/server.go ```go //iServer 接口實現,定義一個Server服務類 type Server struct { //服務器的名稱 Name string //tcp4 or other IPVersion string //服務綁定的IP地址 IP string //服務綁定的端口 Port int //當前Server由用戶綁定的回調router,也就是Server注冊的鏈接對應的處理業務 Router ziface.IRouter } ``` 然后`NewServer()`方法, 初始化Server對象的方法也要加一個初始化成員 ```go /* 創建一個服務器句柄 */ func NewServer (name string) ziface.IServer { s:= &Server { Name :name, IPVersion:"tcp4", IP:"0.0.0.0", Port:7777, Router: nil, } return s } ``` ##### C\) Connection類綁定一個Router成員 zinx/znet/connection.go ```go type Connection struct { //當前連接的socket TCP套接字 Conn *net.TCPConn //當前連接的ID 也可以稱作為SessionID,ID全局唯一 ConnID uint32 //當前連接的關閉狀態 isClosed bool //該連接的處理方法router Router ziface.IRouter //告知該鏈接已經退出/停止的channel ExitBuffChan chan bool } ``` ##### D\) 在Connection調用注冊的Router處理業務 zinx/znet/connection.go ```go func (c *Connection) StartReader() { fmt.Println("Reader Goroutine is running") defer fmt.Println(c.RemoteAddr().String(), " conn reader exit!") defer c.Stop() for { //讀取我們最大的數據到buf中 buf := make([]byte, 512) _, err := c.Conn.Read(buf) if err != nil { fmt.Println("recv buf err ", err) c.ExitBuffChan <- true continue } //得到當前客戶端請求的Request數據 req := Request{ conn:c, data:buf, } //從路由Routers 中找到注冊綁定Conn的對應Handle go func (request ziface.IRequest) { //執行注冊的路由方法 c.Router.PreHandle(request) c.Router.Handle(request) c.Router.PostHandle(request) }(&req) } } ``` 這里我們在conn讀取完客戶端數據之后,將數據和conn封裝到一個Request中,作為Router的輸入數據。 然后我們開啟一個goroutine去調用給Zinx框架注冊好的路由業務。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看