<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                #### 9.3 鏈接的帶緩沖的發包方法 我們之前給`Connection`提供了一個發消息的方法`SendMsg()`,這個是將數據發送到一個無緩沖的channel中`msgChan`。但是如果客戶端鏈接比較多的話,如果對方處理不及時,可能會出現短暫的阻塞現象,我們可以做一個提供一定緩沖的發消息方法,做一些非阻塞的發送體驗。 > zinx/ziface/iconnection.go ```go //定義連接接口 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 //直接將Message數據發送給遠程的TCP客戶端(有緩沖) SendBuffMsg(msgId uint32, data []byte) error //添加帶緩沖發送消息接口 } ``` > zinx/znet/connection.go ```go type Connection struct { //當前Conn屬于哪個Server TcpServer ziface.IServer //當前連接的socket TCP套接字 Conn *net.TCPConn //當前連接的ID 也可以稱作為SessionID,ID全局唯一 ConnID uint32 //當前連接的關閉狀態 isClosed bool //消息管理MsgId和對應處理方法的消息管理模塊 MsgHandler ziface.IMsgHandle //告知該鏈接已經退出/停止的channel ExitBuffChan chan bool //無緩沖管道,用于讀、寫兩個goroutine之間的消息通信 msgChan chan []byte //有關沖管道,用于讀、寫兩個goroutine之間的消息通信 msgBuffChan chan []byte //定義channel成員 } //創建連接的方法 func NewConntion(server ziface.IServer, conn *net.TCPConn, connID uint32, msgHandler ziface.IMsgHandle) *Connection{ //初始化Conn屬性 c := &Connection{ TcpServer:server, Conn: conn, ConnID: connID, isClosed: false, MsgHandler: msgHandler, ExitBuffChan: make(chan bool, 1), msgChan:make(chan []byte), msgBuffChan:make(chan []byte, utils.GlobalObject.MaxMsgChanLen), //不要忘記初始化 } //將新創建的Conn添加到鏈接管理中 c.TcpServer.GetConnMgr().Add(c) return c } ``` 然后將`SendBuffMsg()`方法實現一下: ```go func (c *Connection) SendBuffMsg(msgId uint32, data []byte) error { if c.isClosed == true { return errors.New("Connection closed when send buff 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 ") } //寫回客戶端 c.msgBuffChan <- msg return nil } ``` 我們在Writer中也要有對`msgBuffChan`的數據監控: ```go /* 寫消息Goroutine, 用戶將數據發送給客戶端 */ func (c *Connection) StartWriter() { fmt.Println("[Writer Goroutine is running]") defer fmt.Println(c.RemoteAddr().String(), "[conn Writer exit!]") for { select { case data := <-c.msgChan: //有數據要寫給客戶端 if _, err := c.Conn.Write(data); err != nil { fmt.Println("Send Data error:, ", err, " Conn Writer exit") return } //針對有緩沖channel需要些的數據處理 case data, ok:= <-c.msgBuffChan: if ok { //有數據要寫給客戶端 if _, err := c.Conn.Write(data); err != nil { fmt.Println("Send Buff Data error:, ", err, " Conn Writer exit") return } } else { break fmt.Println("msgBuffChan is Closed") } case <-c.ExitBuffChan: return } } } ```
                  <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>

                              哎呀哎呀视频在线观看