概述

 

go-netty 是一个受netty启发的Go语言高性能网络库

GoDoc license-Apache 2 Go Report Card Build Status Coverage Status

特性

  • 可扩展的传输层,默认实现TCP/UDP/Websocket/KCP/QUIC
  • 可扩展的编解码器,自带多种常用编解码器
  • 基于责任链的流程控制流
  • 核心库无第三方库依赖

安装

go get github.com/go-netty/go-netty

例子

package main

import (
	"fmt"
	"strings"
	"os"

	"github.com/go-netty/go-netty"
	"github.com/go-netty/go-netty/codec/format"
	"github.com/go-netty/go-netty/codec/frame"
	"github.com/go-netty/go-netty/transport/tcp"
)

func main() {

    // 设置子连接的流水线配置
    var childPipelineInitializer = func(channel netty.Channel) {
        channel.Pipeline().
            // 最大允许包长128字节,使用\n分割包, 丢弃分隔符
            AddLast(frame.DelimiterCodec(128, "\n", true)).
            // 解包出来的bytes转换为字符串
            AddLast(format.TextCodec()).
            // 日志处理器, 打印连接建立断开消息,收到的消息
            AddLast(LoggerHandler{}).
            // 业务处理器 (将字符串全部大写)
            AddLast(UpperHandler{})
    }

    // 配置服务器
    netty.NewBootstrap().
        // 配置子链接的流水线配置
        ChildInitializer(childPipelineInitializer).
        // 配置传输使用的方式
        Transport(tcp.New()).
        // 配置监听地址
        Listen("0.0.0.0:9527").
        // 等待退出信号
        Action(netty.WaitSignal(os.Interrupt)).
        // 打印退出消息
        Action(func(bs netty.Bootstrap) {
            fmt.Println("server exited")
        })
}

type LoggerHandler struct {}

func (LoggerHandler) HandleActive(ctx netty.ActiveContext) {
    fmt.Println("go-netty:", "->", "active:", ctx.Channel().RemoteAddr())
    // 写入回显
    ctx.Write("Hello I'm " + "go-netty")
}

func (LoggerHandler) HandleRead(ctx netty.InboundContext, message netty.Message) {
    fmt.Println("go-netty:", "->", "handle read:", message)
    // 交给下一个处理器处理(按照处理器的注册顺序, 此例下一个处理器应该是UpperHandler)
    ctx.HandleRead(message)
}

func (LoggerHandler) HandleInactive(ctx netty.InactiveContext, ex netty.Exception) {
    fmt.Println("go-netty:", "->", "inactive:", ctx.Channel().RemoteAddr(), ex)
    // 连接断开了,默认处理是关闭连接
    ctx.HandleInactive(ex)
}

type UpperHandler struct {}

func (UpperHandler) HandleRead(ctx netty.InboundContext, message netty.Message) {
    // 业务逻辑,将字符串大写化
    text := message.(string)
    upText := strings.ToUpper(text)
    // 写入返回结果给客户端
    ctx.Write(text + " -> " + upText)
}

使用Netcat发送消息

$ echo -n -e "Hello Go-Netty\nhttps://go-netty.com\n" | nc 127.0.0.1 9527
Hello I'm go-netty
Hello Go-Netty -> HELLO GO-NETTY
https://go-netty.com -> HTTPS://GO-NETTY.COM