go-netty 介绍
go-netty 是大量参考了netty的设计并融合Golang本身的协程特性而开发的一款高性能网络库
Feature (特性)
Documentation (文档)
Examples (示例)
- chat_server (基于websocket的聊天室)
- file_server (基于http的文件浏览器)
- tcp_server (自义定tcp服务器)
- redis_cli (简单的redis客户端)
- go-netty-samples (更多例子)
使用
创建bootstrap, 用于提供服务或者对外建立连接
var bootstrap = netty.NewBootstrap()
bootstrap.ChildInitializer(func(channel netty.Channel) { channel.Pipeline(). // 按照自定义协议解码帧(2字节的长度字段) AddLast(frame.LengthFieldCodec(binary.LittleEndian, 1024, 0, 2, 0, 0)). // 消息内容为文本格式(可自定义为 json,protobuf 等编解码器) AddLast(format.TextCodec()). // 处理消息 AddLast(EchoHandler{"Server"}) })
配置服务器(客户端)所使用的传输协议
bootstrap.Transport(tcp.New())
开始监听端口并开始提供服务,直到收到指定信号后退出
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()) // 给对端发送一条消息,将进入如下流程(视编解码配置) // Text -> TextCodec -> LengthFieldCodec -> Channel.Write // 文本 文本编码 组装协议格式(长度字段) 网络发送 ctx.Write("Hello I'm " + l.role) // 向后续的handler传递控制权 // 如果是最后一个handler或者需要中断请求可以不用调用 ctx.HandleActive() } func (l EchoHandler) HandleRead(ctx netty.InboundContext, message netty.Message) { fmt.Println(l.role, "->", "handle read:", message) // 向后续的handler传递控制权 // 如果是最后一个handler或者需要中断请求可以不用调用 ctx.HandleRead(message) } func (l EchoHandler) HandleInactive(ctx netty.InactiveContext, ex netty.Exception) { fmt.Println(l.role, "->", "inactive:", ctx.Channel().RemoteAddr(), ex) // 向后续的handler传递控制权 // 如果是最后一个handler或者需要中断请求可以不用调用 ctx.HandleInactive(ex) }
go-netty 官网
https://github.com/go-netty/go-netty
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。