go-netty / go-netty

Extensible network application framework inspired by netty
Apache License 2.0
478 stars 92 forks source link
go-netty net netty

GO-NETTY

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

中文介绍

Introduction

go-netty is heavily inspired by netty

Feature

Documentation

Examples

Quick Start

package main

import (
    "fmt"
    "strings"

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

func main() {
    // child pipeline initializer
    var childInitializer = func(channel netty.Channel) {
        channel.Pipeline().
            // the maximum allowable packet length is 128 bytes,use \n to split, strip delimiter
            AddLast(frame.DelimiterCodec(128, "\n", true)).
            // convert to string
            AddLast(format.TextCodec()).
            // LoggerHandler, print connected/disconnected event and received messages
            AddLast(LoggerHandler{}).
            // UpperHandler (string to upper case)
            AddLast(UpperHandler{})
    }

    // create bootstrap & listening & accepting
    netty.NewBootstrap(netty.WithChildInitializer(childInitializer)).
        Listen(":9527").Sync()
}

type LoggerHandler struct {}

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

func (LoggerHandler) HandleRead(ctx netty.InboundContext, message netty.Message) {
    fmt.Println("go-netty:", "->", "handle read:", message)
    // leave it to the next handler(UpperHandler)
    ctx.HandleRead(message)
}

func (LoggerHandler) HandleInactive(ctx netty.InactiveContext, ex netty.Exception) {
    fmt.Println("go-netty:", "->", "inactive:", ctx.Channel().RemoteAddr(), ex)
    // disconnected,the default processing is to close the connection
    ctx.HandleInactive(ex)
}

type UpperHandler struct {}

func (UpperHandler) HandleRead(ctx netty.InboundContext, message netty.Message) {
    // text to upper case
    text := message.(string)
    upText := strings.ToUpper(text)
    // write the result to the client
    ctx.Write(text + " -> " + upText)
}

use Netcat to send message

$ 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