Netty入門(一)環境搭建及使用


一、項目創建

  在 Eclipse 中右鍵,新建->項目->Maven->Maven Project->下一步->選擇 quickstart

  

  下一步->設置如圖(參數自取)

  

  點擊完成。

   項目會自動創建 pom.xml 文件,打開該文件,點擊 Dependencies標簽->Add..,設置如圖(參數由 Netty 版本決定):

  

  點擊 OK,保存文件,觀察 Maven Dependencies 下,

  

  netty 的 jar 包已經添加完畢。到此為止,項目配置完畢了,下面就來添加代碼吧。

 

二、實現一個簡單的服務端 demo

1. 首選我們需要自定義一個類處理服務器接收到的消息

 1 package com.coder.server;
 2 
 3 import io.netty.buffer.ByteBuf;
 4 import io.netty.channel.ChannelHandlerContext;
 5 import io.netty.channel.ChannelInboundHandlerAdapter;
 6 import io.netty.util.CharsetUtil;
 7 import io.netty.util.ReferenceCountUtil;
 8 
 9 /**
10  * 輸出接收到的消息
11  * @author Coder
12  *
13  */
14 public class HelloServerHandler extends ChannelInboundHandlerAdapter {
15     /**
16      * 收到數據時調用
17      */
18     @Override
19     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
20         try {
21             ByteBuf in = (ByteBuf)msg;
22             System.out.print(in.toString(CharsetUtil.UTF_8));
23         } finally {
24             // 拋棄收到的數據
25             ReferenceCountUtil.release(msg);
26         }
27         
28 //        ctx.write(msg);
29 //        ctx.flush();
30     }
31     
32     /**
33      * 當Netty由於IO錯誤或者處理器在處理事件時拋出異常時調用
34      */
35     @Override
36     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
37         // 當出現異常就關閉連接
38         cause.printStackTrace();
39         ctx.close();
40     }
41 }

  該類主要是實現了接收客戶端發來的消息,並輸出到控制台。

 

2. 然后我們就能實現一個簡單的服務端程序了

  Netty 服務器的通信步驟為:

  1.  創建兩個NIO線程組,一個專門用於接收來自客戶端的連接,另一個則用於處理已經被接收的連接。
  2.  創建一個ServerBootstrap對象,配置Netty的一系列參數,例如接受傳出數據的緩存大小等。
  3.  創建一個用於實際處理數據的類ChannelInitializer,進行初始化的准備工作,比如設置接受傳出數據的字符集、格式以及實際處理數據的接口。
  4.  綁定端口,執行同步阻塞方法等待服務器端啟動即可。
 1 package com.coder.server;
 2 
 3 import io.netty.bootstrap.ServerBootstrap;
 4 import io.netty.channel.ChannelFuture;
 5 import io.netty.channel.ChannelInitializer;
 6 import io.netty.channel.ChannelOption;
 7 import io.netty.channel.EventLoopGroup;
 8 import io.netty.channel.nio.NioEventLoopGroup;
 9 import io.netty.channel.socket.SocketChannel;
10 import io.netty.channel.socket.nio.NioServerSocketChannel;
11 
12 public class HelloServer {
13     private int port;
14     
15     public HelloServer(int port) {
16         this.port = port;
17     }
18     
19     public void run() throws Exception {
20         EventLoopGroup bossGroup = new NioEventLoopGroup();        // 用來接收進來的連接
21         EventLoopGroup workerGroup = new NioEventLoopGroup();    // 用來處理已經被接收的連接
22         System.out.println("准備運行端口:" + port);
23         
24         try {
25             ServerBootstrap b = new ServerBootstrap();
26             b.group(bossGroup, workerGroup)
27             .channel(NioServerSocketChannel.class)            // 這里告訴Channel如何接收新的連接
28             .childHandler( new ChannelInitializer<SocketChannel>() {
29                 @Override
30                 protected void initChannel(SocketChannel ch) throws Exception {
31                     // 自定義處理類
32                     ch.pipeline().addLast(new HelloServerHandler());
33                 }
34             })
35             .option(ChannelOption.SO_BACKLOG, 128)
36             .childOption(ChannelOption.SO_KEEPALIVE, true);
37             
38             // 綁定端口,開始接收進來的連接
39             ChannelFuture f = b.bind(port).sync();
40             
41             // 等待服務器socket關閉
42             f.channel().closeFuture().sync();
43         } catch (Exception e) {
44             workerGroup.shutdownGracefully();
45             bossGroup.shutdownGracefully();
46         }
47     }
48     
49     public static void main(String[] args) throws Exception {
50         int port = 10110;
51         new HelloServer(port).run();
52     }
53 
54 }

   那么,這便是一個可執行的服務端程序了。運行后控制台輸出如下:

  

 

三、測試 

   我們可以去自定義客戶端程序,這里為了方便使用 telnet 充當客戶端。

  需要注意的是,Windows 默認是沒有開啟 telnet 客戶端的,需要我們手動開啟。

  菜單->控制面板->程序->打開或關閉Windows功能,設置如圖:

  

  這樣我們就能用 telnet 客戶端了。

  在 cmd 窗口輸入命令如下:

  

  打開窗口如下:

  

  這時候我們在該窗口輸入什么,eclipse 控制台也會對應輸出相應內容。如下:

  

  注意:telnet 窗口會看不到輸入的字符,只要輸入 ctrl+L 就可以看到輸入的字符了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM