1.介紹
netty是一個基於java nio的網絡通信框架。Netty是一個NIO client-server(客戶端服務器)框架,使用Netty可以快速開發網絡應用,例如服務器和客戶端協議。Netty提供了一種新的方式來使開發網絡應用程序,這種新的方式使得它很容易使用和有很強的擴展性。Netty的內部實現時很複雜的,但是Netty提供了簡單易用的api從網絡處理代碼中解耦業務邏輯。Netty是完全基於NIO實現的,所以整個Netty都是異步的。網絡應用程序通常需要有較高的可擴展性,無論是Netty還是其他的基於Java NIO的框架,都會提供可擴展性的解決方案。Netty中一個關鍵組成部分是它的異步特性.
2.知識點記錄
2.1 netty中handle的執行順序
Handler在netty中,佔據着非常重要的地位,Handler與Servlet中的filter很像,通過Handler可以完成通訊報文的編碼解碼,攔截指定的報文,統一對錯誤進行處理,統一對請求進行計數,控制handler執行與否.Netty中的所有handler都實現自ChannelHandler接口,按照輸入輸出來分,分爲兩大類:
ChannelInBoundHandler對接收到的報文進行處理,一般用來執行解碼,讀取數據,進行業務處理等。
ChannelOutBoundHandler對發出去的報文進行處理,一般用來進行解碼,發送報文到對端。
Netty中可以註冊多個handler,ChannelInBoundHandler按照註冊的先後順序執行, ChannelOutBoundHandler按照註冊的先後逆序執行。
2.2 在使用的過程中需要注意
channelinboundhandler之間的傳遞,通過調用ctx.fireChannelRead(msg)實現,調用ctx.write(msg)將傳遞到ChannelOutBoundHandler.
ctx.write()方法執行之後,需要調用flush()方法才能另它立即生效。
使用ctx.write(msg)傳遞消息,Inbound需要放在結尾,在Outbound之後,不然outboundhandler會不執行; 但是使用channel.write(msg)、pipline.write(msg)情況會不一致,都會執行,那是因爲channel和pipline會貫穿整個流。
如果使用addlast方法來組裝handler,則爲以下執行順序,註冊兩個InboundHandler,執行順序爲註冊順序,所以應該是InboundHandler1 InboundHandler2。 註冊兩個OutboundHandler,執行順序爲註冊順序的逆序,所以應該是OutboundHandler2 OutboundHandler1 。
2.3 netty中,通訊的雙方建立連接後,會把數據按照Bytebuf的方式進行傳輸,例如 http協議中,就是通過HttpRequestDecoder對Bytebuf數據流進行處理,轉換成http對象,基於這個思路定義了一種通訊協議,server和client端直接傳輸java對象。實現的原理是通過encoder把java對象轉換 Bytebuf流進行傳輸,通過decoder把Bytebuf轉換成java對象進行處理。