原文轉載自:http://blog.csdn.net/kobejayandy/article/details/11493717
先囉嗦兩句,如果你還不知道Netty是做什麼的能做什麼。那可以先簡單的搜索瞭解一下。我只能說Netty是一個NIO的框架,可以用於開發分佈式的Java程序。具體能做什麼,各位可以儘量發揮想象。技術,是服務於人而不是侷限住人的。
如果你已經萬事具備,那麼我們先從一段代碼開始。程序員們習慣的上手第一步,自然是"Hello world",不過Netty官網的例子卻偏偏拋棄了"Hello world"。那我們就自己寫一個最簡單的"Hello world"的例子,作爲上手。
- /**
- * Netty 服務端代碼
- *
- * @author lihzh
- * @alia OneCoder
- * @blog http://www.coderli.com
- */
- public class HelloServer {
- public static void main(String args[]) {
- // Server服務啓動器
- ServerBootstrap bootstrap = new ServerBootstrap(
- new NioServerSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- // 設置一個處理客戶端消息和各種消息事件的類(Handler)
- bootstrap
- .setPipelineFactory(new ChannelPipelineFactory() {
- @Override
- public ChannelPipeline getPipeline()
- throws Exception {
- return Channels
- .pipeline(new HelloServerHandler());
- }
- });
- // 開放8000端口供客戶端訪問。
- bootstrap.bind(new InetSocketAddress(8000));
- }
- private static class HelloServerHandler extends
- SimpleChannelHandler {
- /**
- * 當有客戶端綁定到服務端的時候觸發,打印"Hello world, I'm server."
- *
- * @alia OneCoder
- * @author lihzh
- */
- @Override
- public void channelConnected(
- ChannelHandlerContext ctx,
- ChannelStateEvent e) {
- System.out.println("Hello world, I'm server.");
- }
- }
- }
- /**
- * Netty 客戶端代碼
- *
- * @author lihzh
- * @alia OneCoder
- * @blog http://www.coderli.com
- */
- public class HelloClient {
- public static void main(String args[]) {
- // Client服務啓動器
- ClientBootstrap bootstrap = new ClientBootstrap(
- new NioClientSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- // 設置一個處理服務端消息和各種消息事件的類(Handler)
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- @Override
- public ChannelPipeline getPipeline() throws Exception {
- return Channels.pipeline(new HelloClientHandler());
- }
- });
- // 連接到本地的8000端口的服務端
- bootstrap.connect(new InetSocketAddress(
- "127.0.0.1", 8000));
- }
- private static class HelloClientHandler extends SimpleChannelHandler {
- /**
- * 當綁定到服務端的時候觸發,打印"Hello world, I'm client."
- *
- * @alia OneCoder
- * @author lihzh
- */
- @Override
- public void channelConnected(ChannelHandlerContext ctx,
- ChannelStateEvent e) {
- System.out.println("Hello world, I'm client.");
- }
- }
- }
既然是分佈式的,自然要分多個服務。Netty中,需要區分Server和Client服務。所有的Client都是綁定在Server上的,他們之間是不能通過Netty直接通信的。(自己採用的其他手段,不包括在內。)。白話一下這個通信過程,Server端開放端口,供Client連接,Client發起請求,連接到Server指定的端口,完成綁定。隨後便可自由通信。其實就是普通Socket連接通信的過程。
Netty框架是基於事件機制的,簡單說,就是發生什麼事,就找相關處理方法。就跟着火了找119,搶劫了找110一個道理。所以,這裏,我們處理的是當客戶端和服務端完成連接以後的這個事件。什麼時候完成的連接,Netty知道,他告訴我了,我就負責處理。這就是框架的作用。Netty,提供的事件還有很多,以後會慢慢的接觸和介紹。
你應該已經可以上手了:)