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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                #### 7.1 Zinx-V0.7代碼實現 我們的代碼改動并不是很大。 ##### A\) 添加讀寫模塊交互數據的管道 > zinx/znet/connection.go ```go type Connection struct { //當前連接的socket TCP套接字 Conn *net.TCPConn //當前連接的ID 也可以稱作為SessionID,ID全局唯一 ConnID uint32 //當前連接的關閉狀態 isClosed bool //消息管理MsgId和對應處理方法的消息管理模塊 MsgHandler ziface.IMsgHandle //告知該鏈接已經退出/停止的channel ExitBuffChan chan bool //無緩沖管道,用于讀、寫兩個goroutine之間的消息通信 msgChan chan []byte } //創建連接的方法 func NewConntion(conn *net.TCPConn, connID uint32, msgHandler ziface.IMsgHandle) *Connection{ c := &Connection{ Conn: conn, ConnID: connID, isClosed: false, MsgHandler: msgHandler, ExitBuffChan: make(chan bool, 1), msgChan:make(chan []byte), //msgChan初始化 } return c } ``` 我們給`Connection`新增一個管道成員`msgChan`,作用是用于讀寫兩個go的通信。 ##### B\) 創建Writer Goroutine > zinx/znet/connection.go ```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 } case <- c.ExitBuffChan: //conn已經關閉 return } } } ``` ##### C\) Reader講發送客戶端的數據改為發送至Channel 修改Reader調用的`SendMsg()`方法 > zinx/znet/connection.go ```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 ") } //寫回客戶端 c.msgChan <- msg //將之前直接回寫給conn.Write的方法 改為 發送給Channel 供Writer讀取 return nil } ``` D\) 啟動Reader和Writer > zinx/znet/connection.go ```go //啟動連接,讓當前連接開始工作 func (c *Connection) Start() { //1 開啟用戶從客戶端讀取數據流程的Goroutine go c.StartReader() //2 開啟用于寫回客戶端數據流程的Goroutine go c.StartWriter() for { select { 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>

                              哎呀哎呀视频在线观看