go-netty is heavily inspired by netty
- Extensible transport support, default support TCP, UDP, QUIC, KCP, Websocket
- Extensible codec support
- Based on responsibility chain model
- Zero-dependency
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