<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 功能強大 支持多語言、二開方便! 廣告
                #### 5.3 Zinx-V0.5代碼實現 現在我們需要把封包和拆包的功能集成到Zinx中,并且測試Zinx該功能是否生效。 ##### A\) Request字段修改 首先我們要將我們之前的Request中的`[]byte`類型的data字段改成Message類型. > zinx/znet/request.go ```go package znet import "zinx/ziface" type Request struct { conn ziface.IConnection //已經和客戶端建立好的 鏈接 msg ziface.IMessage //客戶端請求的數據 } //獲取請求連接信息 func(r *Request) GetConnection() ziface.IConnection { return r.conn } //獲取請求消息的數據 func(r *Request) GetData() []byte { return r.msg.GetData() } //獲取請求的消息的ID func (r *Request) GetMsgID() uint32 { return r.msg.GetMsgId() } ``` ##### B\) 集成拆包過程 接下來我們需要在Connection的`StartReader()`方法中,修改之前的讀取客戶端的這段代碼: ```go func (c *Connection) StartReader() { //... for { //讀取我們最大的數據到buf中 buf := make([]byte, utils.GlobalObject.MaxPacketSize) _, err := c.Conn.Read(buf) if err != nil { fmt.Println("recv buf err ", err) c.ExitBuffChan <- true continue } //... } } ``` 改成如下: > zinx/znet/connection.go StartReader\(\)方法 ```go func (c *Connection) StartReader() { fmt.Println("Reader Goroutine is running") defer fmt.Println(c.RemoteAddr().String(), " conn reader exit!") defer c.Stop() for { // 創建拆包解包的對象 dp := NewDataPack() //讀取客戶端的Msg head headData := make([]byte, dp.GetHeadLen()) if _, err := io.ReadFull(c.GetTCPConnection(), headData); err != nil { fmt.Println("read msg head error ", err) c.ExitBuffChan <- true continue } //拆包,得到msgid 和 datalen 放在msg中 msg , err := dp.Unpack(headData) if err != nil { fmt.Println("unpack error ", err) c.ExitBuffChan <- true continue } //根據 dataLen 讀取 data,放在msg.Data中 var data []byte if msg.GetDataLen() > 0 { data = make([]byte, msg.GetDataLen()) if _, err := io.ReadFull(c.GetTCPConnection(), data); err != nil { fmt.Println("read msg data error ", err) c.ExitBuffChan <- true continue } } msg.SetData(data) //得到當前客戶端請求的Request數據 req := Request{ conn:c, msg:msg, //將之前的buf 改成 msg } //從路由Routers 中找到注冊綁定Conn的對應Handle go func (request ziface.IRequest) { //執行注冊的路由方法 c.Router.PreHandle(request) c.Router.Handle(request) c.Router.PostHandle(request) }(&req) } } ``` ##### C\) 提供封包方法 現在我們已經將拆包的功能集成到Zinx中了,但是使用Zinx的時候,如果我們希望給用戶返回一個TLV格式的數據,總不能每次都經過這么繁瑣的過程,所以我們應該給Zinx提供一個封包的接口,供Zinx發包使用。 > zinx/ziface/iconnection.go 新增`SendMsg()`方法 ```go package ziface import "net" //定義連接接口 type IConnection interface { //啟動連接,讓當前連接開始工作 Start() //停止連接,結束當前連接狀態M Stop() //從當前連接獲取原始的socket TCPConn GetTCPConnection() *net.TCPConn //獲取當前連接ID GetConnID() uint32 //獲取遠程客戶端地址信息 RemoteAddr() net.Addr //直接將Message數據發送數據給遠程的TCP客戶端 SendMsg(msgId uint32, data []byte) error } ``` > zinx/znet/connection.go `SendMsg()`方法實現: ```go //直接將Message數據發送數據給遠程的TCP客戶端 func (c *Connection) SendMsg(msgId uint32, data []byte) error { if c.isClosed == true { return errors.New("Connection closed when send msg") } //將data封包,并且發送 dp := NewDataPack() msg, err := dp.Pack(NewMsgPackage(msgId, data)) if err != nil { fmt.Println("Pack error msg id = ", msgId) return errors.New("Pack error msg ") } //寫回客戶端 if _, err := c.Conn.Write(msg); err != nil { fmt.Println("Write msg id ", msgId, " error ") c.ExitBuffChan <- true return errors.New("conn Write error") } return nil } ```
                  <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>

                              哎呀哎呀视频在线观看