<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          go-netty高性能網(wǎng)絡(luò)庫

          聯(lián)合創(chuàng)作 · 2023-09-29 12:14

          go-netty 是大量參考了netty的設(shè)計并融合Golang本身的協(xié)程特性而開發(fā)的一款高性能網(wǎng)絡(luò)庫

          Feature (特性)

          • 可擴展多種傳輸協(xié)議,并且默認實現(xiàn)了 TCP, KCPWebsocket
          • 可擴展多種解碼器,默認實現(xiàn)了常見的編解碼器
          • 基于責任鏈模型的流程控制
          • 核心庫零依賴

          Documentation (文檔)

          GoDoc

          Examples (示例)

          使用

          創(chuàng)建bootstrap, 用于提供服務(wù)或者對外建立連接

          var bootstrap = netty.NewBootstrap()
          

          配置服務(wù)連接的處理器 (同樣還有一個ClientInitializer 對應(yīng)客戶端連接處理器配置)

          bootstrap.ChildInitializer(func(channel netty.Channel) {
              channel.Pipeline().
                  // 按照自定義協(xié)議解碼幀(2字節(jié)的長度字段)
                  AddLast(frame.LengthFieldCodec(binary.LittleEndian, 1024, 0, 2, 0, 0)).
                  // 消息內(nèi)容為文本格式(可自定義為 json,protobuf 等編解碼器)
                  AddLast(format.TextCodec()).
                  // 處理消息
                  AddLast(EchoHandler{"Server"})
          })
          

          配置服務(wù)器(客戶端)所使用的傳輸協(xié)議

          bootstrap.Transport(tcp.New())
          

          開始監(jiān)聽端口并開始提供服務(wù),直到收到指定信號后退出

          bootstrap.Listen("tcp://0.0.0.0:6565").RunForever(os.Kill, os.Interrupt)
          

          LogHandler 處理器

          type EchoHandlerstruct {
              role string
          }
          
          func (l EchoHandler) HandleActive(ctx netty.ActiveContext) {
              fmt.Println(l.role, "->", "active:", ctx.Channel().RemoteAddr())
          
              // 給對端發(fā)送一條消息,將進入如下流程(視編解碼配置)
              // Text -> TextCodec -> LengthFieldCodec   -> Channel.Write
              // 文本     文本編碼      組裝協(xié)議格式(長度字段)     網(wǎng)絡(luò)發(fā)送
              ctx.Write("Hello I'm " + l.role)
          
              // 向后續(xù)的handler傳遞控制權(quán)
              // 如果是最后一個handler或者需要中斷請求可以不用調(diào)用
              ctx.HandleActive()
          }
          
          func (l EchoHandler) HandleRead(ctx netty.InboundContext, message netty.Message) {
              fmt.Println(l.role, "->", "handle read:", message)
          
              // 向后續(xù)的handler傳遞控制權(quán)
              // 如果是最后一個handler或者需要中斷請求可以不用調(diào)用
              ctx.HandleRead(message)
          }
          
          func (l EchoHandler) HandleInactive(ctx netty.InactiveContext, ex netty.Exception) {
              fmt.Println(l.role, "->", "inactive:", ctx.Channel().RemoteAddr(), ex)
          
              // 向后續(xù)的handler傳遞控制權(quán)
              // 如果是最后一個handler或者需要中斷請求可以不用調(diào)用
              ctx.HandleInactive(ex)
          }
          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码精品一区二区三区免费久久 | 久久无码专区 | 一区嫩苞性淫无码视频 | 国产日逼逼 | 久久夜夜 |