Netty5 入門HelloWorld

奮鬥的小媛。發表於2020-12-16

Netty5 入門HelloWorld

一、客戶端程式碼及關鍵類說明

 1 /**
 2  * netty5的客戶端
 3  * @author -zhengzx-
 4  *
 5  */
 6 public class ClientSocket {
 7 
 8     public static void main(String[] args) {
 9         //服務類
10         Bootstrap bootstrap = new Bootstrap();
11         //worker
12         EventLoopGroup worker = new NioEventLoopGroup();
13         
14         try {
15             //設定執行緒池
16             bootstrap.group(worker);
17             //設定socket工廠
18             bootstrap.channel(NioSocketChannel.class);
19             //設定管道
20             bootstrap.handler(new ChannelInitializer<Channel>() {
21 
22                 @Override
23                 protected void initChannel(Channel ch) throws Exception {
24                     ch.pipeline().addLast(new StringDecoder());
25                     ch.pipeline().addLast(new StringEncoder());
26                     ch.pipeline().addLast(new ClientSocketHandler());
27                 }
28             });
29             
30             ChannelFuture connect = bootstrap.connect("127.0.0.1", 10101);
31             
32             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
33             while(true){
34                 System.out.println("請輸入:");
35                 String msg = bufferedReader.readLine();
36                 connect.channel().writeAndFlush(msg);
37             }
38             
39         } catch (Exception e) {
40              e.printStackTrace();
41         } finally{
42             worker.shutdownGracefully();
43         }
44     }
45 }
【1】**EventLoopGroup:**`客服端需要指定 EvnetLoopGroup,Netty5 中例項為 NioEventLoopGroup:表示一個 NIO 的EvnetLoopGroup。
`【2】**ChannelType:**`指定 Channel 的型別,客戶端為 NioSocketChannel。在 Netty 中,,Channel 是一個 Socket 的抽象,它為使用者提供了關於 Socket 狀態(是否連線還是斷開) 以及對 Socket 的讀寫等操作。每當 Netty 建立了一個連線後, 都會有一個對應的 Channel 例項。
`【3】**Handler:**設定資料的處理類。
1 public class ClientSocketHandler extends SimpleChannelInboundHandler<String>{
2 
3     @Override
4     protected void messageReceived(ChannelHandlerContext ctx, String msg) throws Exception {
5         System.out.println("客戶端接受訊息:"+msg);
6     }
7 }

【4】**ChannelPipeline:**在例項化一個 Channel 時,必然伴隨著例項化一個 ChannelPipeline。

二、服務端程式碼及說明

【1】**EventLoopGroup:**不論是伺服器端還是客戶端,都必須指定 EventLoopGroup. 在這個例子中, 指定了NioEventLoopGroup, 表示一個 NIO 的 EventLoopGroup, 不過伺服器端需要指定兩個 EventLoopGroup, 一個是 bossGroup, 用於處理客戶端的連線請求; 另一個是 workerGroup, 用於處理與各個客戶端連線的 IO 操作。
【2】**ChannelType:**指定 Channel 的型別. 因為是伺服器端, 因此使用了 NioServerSocketChannel。
【3】**Handler:**設定資料的處理器。

 1 public class ServerSocketHandler extends SimpleChannelInboundHandler<String>{
 2 
 3     @Override
 4     protected void messageReceived(ChannelHandlerContext ctx, String msg) throws Exception {
 5         System.out.println(msg);
 6         //返回字串
 7         ctx.writeAndFlush("hi");
 8     }
 9     
10 }

相關文章