go-netty高性能網(wǎng)絡(luò)庫
go-netty 是大量參考了netty的設(shè)計并融合Golang本身的協(xié)程特性而開發(fā)的一款高性能網(wǎng)絡(luò)庫
Feature (特性)
Documentation (文檔)
Examples (示例)
- chat_server (基于websocket的聊天室)
- file_server (基于http的文件瀏覽器)
- tcp_server (自義定tcp服務(wù)器)
- redis_cli (簡單的redis客戶端)
- go-netty-samples (更多例子)
使用
創(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)
}評論
圖片
表情
