Netty 中文教程 (二) Hello World !詳解
上一篇文章,筆者提供了一個Hello World 的Netty示例。
時間過去了這么久,准備解釋一下示例代碼。
1.HelloServer 詳解
HelloServer首先定義了一個靜態終態的變量---服務端綁定端口7878。至於為什么是這個7878端口,純粹是筆者個人喜好。大家可以按照自己的習慣選擇端口。當然了。常用的幾個端口(例如:80,8080,843(Flash及Silverlight策略文件請求端口等等),3306(Mysql數據庫占用端口))最好就不要占用了,避免一些奇怪的問題。
HelloServer類里面的代碼並不多。只有一個main函數,加上內部短短的幾行代碼。
Main函數開始的位置定義了兩個工作線程,一個命名為WorkerGroup,另一個命名為BossGroup。都是實例化NioEventLoopGroup。這一點和3.x版本中基本思路是一致的。Worker線程用於管理線程為Boss線程服務。
講到這里需要解釋一下EventLoopGroup,它是4.x版本提出來的一個新概念。類似於3.x版本中的線程。用於管理Channel連接的。在main函數的結尾就用到了EventLoopGroup提供的便捷的方法,shutdownGraceFully(),翻譯為中文就是優雅的全部關閉。感覺是不是很有意思。作者居然會如此可愛的命名了這樣一個函數。查看相應的源代碼。我們可以在DefaultEventExecutorGroup的父類MultithreadEventExecutorGroup中看到它的實現代碼。關閉了全部EventExecutor數組child里面子元素。相比於3.x版本這是一個比較重大的改動。開發者可以很輕松的全部關閉,而不需要擔心出現內存泄露。
在try里面實例化一個ServerBootstrap b。設置group。設置channel為NioServerSocketChannel。
設置childHandler,在這里使用實例化一個HelloServerInitializer類來實現,繼承ChannelInitializer<SocketChannel>。內部的代碼我們可以在前文的注視中大致了解一下,主要作用是設置相關的字節解碼編碼器,和代碼處理邏輯。Handler是Netty包里面占很大一個比例。可見其的作用和用途。Handler涉及很多領域。HTTP,UDP,Socket,WebSocket等等。詳細的部分在本章的第三節解釋。
設置好Handler綁定端口7878,並調用函數sync(),監聽端口(等待客戶端連接和發送消息)。並監聽端口關閉(為了防止線程停止)。
最后finally我們要優雅的全部關閉服務端。^_^
2.HelloClient詳解
相比於服務端的代碼。客戶端要精簡一些。
客戶端僅僅只需要一個worker的EventLoopGroup。其次是類似於ServerBootstrap的HandlerInitializer。
唯一不同的可能就是客戶端的connect方法。服務端的綁定並監聽端口,客戶端是連接指定的地址。Sync().channel()是為了返回這個連接服務端的channel,並用於后面代碼的調用。
BufferedReader 這個是用於控制台輸入的。不做詳細的解釋了就。大家都懂的。
當用戶輸入一行內容並回車之后。循環的讀取每一行內容。然后使用writeAndFlush向服務端發送消息。
3.HandlerInitializer詳解
Handler在Netty中是一個比較重要的概念。有着相當重要的作用。相比於Netty的底層。我們接觸更多的應該是他的Handler。在這里我將它剝離出來單獨解釋。
ServerHandlerInitializer繼承與ChannelInitializer<SocketChannel>需要我們實現一個initChannel()方法。我們定義的handler就是寫在這里面。
在最開始的地方定義了一個DelimiterBasedFrameDecoder。按直接翻譯就是基於分隔符的幀解碼器。再一次感覺框架的作者的命名,好直接好簡單。詳細的內容我們在后面的文章中在為大家詳細的解釋。目前大家知道他是以分隔符為分割標准的解碼器就好了。
也許有人會問分隔符是什么?我只能 !*_* :“納尼 !!”。分隔符其實就是“\n”我們在學習C語言的時候最常用的的也許就是這個分隔符了吧。
下面的則是StringDecoder 和StringEncoder。字符串解碼器和字符串編碼器。
最后面則是我們自己的邏輯。服務/客戶端邏輯是在消息解碼之后處理的。然后服務/客戶端返回相關消息則是需要對消息進行相對應的編碼。最終才是以二進制數據流的形勢發送給服務/客戶端的。
內容暫時就寫到這里。O(∩_∩)O哈哈~。后面的東西慢慢為大家完善。
假如有甚么不正確的地方,敬請諒解。求大神指正。
作者:TinyZ
出處:http://www.cnblogs.com/zou90512/
關於作者:努力學習,天天向上。不斷探索學習,提升自身價值。記錄經驗分享。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接
如有問題,可以通過 zou90512@126.com 聯系我,非常感謝。
筆者網店: http://aoleitaisen.taobao.com. 歡迎廣大讀者圍觀