溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

發(fā)布時(shí)間:2020-06-24 21:08:05 來源:網(wǎng)絡(luò) 閱讀:1154 作者:薩芬s 欄目:移動(dòng)開發(fā)

Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

Netty 是一個(gè)基于 JAVA NIO 類庫的異步通信框架,它的架構(gòu)特點(diǎn)是:異步非阻塞、基于事件驅(qū)動(dòng)、高性能、高可靠性和高可定制性。換句話說,Netty是一個(gè)NIO框架,使用它可以簡(jiǎn)單快速地開發(fā)網(wǎng)絡(luò)應(yīng)用程序,比如客戶端和服務(wù)端的協(xié)議。Netty大大簡(jiǎn)化了網(wǎng)絡(luò)程序的開發(fā)過程比如TCP和UDP的 Socket的開發(fā)。Netty 已逐漸成為 Java NIO 編程的首選框架。

項(xiàng)目官方地址:http://netty.io/index.html

一. Netty 的優(yōu)點(diǎn):
  • API 使用簡(jiǎn)單,開發(fā)門檻低;

  • 功能強(qiáng)大,預(yù)置了多種編解碼功能,支持多種主流協(xié)議;

  • 定制能力強(qiáng),可以通過 ChannelHandler 對(duì)通信框架進(jìn)行靈活的擴(kuò)展;

  • 性能高,通過與其它業(yè)界主流的 NIO 框架對(duì)比,Netty 的綜合性能最優(yōu);

  • 社區(qū)活躍,版本迭代周期短,發(fā)現(xiàn)的 BUG 可以被及時(shí)修復(fù),同時(shí),更多的新功能會(huì)被加入;

  • 經(jīng)歷了大規(guī)模的商業(yè)應(yīng)用考驗(yàn),質(zhì)量得到驗(yàn)證。在互聯(lián)網(wǎng)、大數(shù)據(jù)、網(wǎng)絡(luò)游戲、企業(yè)應(yīng)用、電信軟件等眾多行業(yè)得到成功商用,證明了它完全滿足不同行業(yè)的商用標(biāo)準(zhǔn)。

二. 搭建Netty服務(wù):
  1. 添加pom依賴

    Pom代碼  Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

     

    1. <dependency>  

    2.     <groupId>io.netty</groupId>  

    3.     <artifactId>netty-all</artifactId>  

    4.     <version>4.1.0.Final</version>  

    5. </dependency>  

  2. SimpleServer(服務(wù)端)

    Java代碼  Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

     

    1. package com.yingjun.netty.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. /** 

    13.  *  

    14.  * Netty中,通訊的雙方建立連接后,會(huì)把數(shù)據(jù)按照ByteBuf的方式進(jìn)行傳輸, 

    15.  * 例如http協(xié)議中,就是通過HttpRequestDecoder對(duì)ByteBuf數(shù)據(jù)流進(jìn)行處理,轉(zhuǎn)換成http的對(duì)象。 

    16.  *  

    17.  */  

    18. public class SimpleServer {  

    19.     private int port;  

    20.   

    21.     public SimpleServer(int port) {  

    22.         this.port = port;  

    23.     }  

    24.   

    25.     public void run() throws Exception {  

    26.         //EventLoopGroup是用來處理IO操作的多線程事件循環(huán)器  

    27.         //bossGroup 用來接收進(jìn)來的連接  

    28.         EventLoopGroup bossGroup = new NioEventLoopGroup();   

    29.         //workerGroup 用來處理已經(jīng)被接收的連接  

    30.         EventLoopGroup workerGroup = new NioEventLoopGroup();  

    31.         try {  

    32.             //啟動(dòng) NIO 服務(wù)的輔助啟動(dòng)類  

    33.             ServerBootstrap b = new ServerBootstrap();   

    34.             b.group(bossGroup, workerGroup)  

    35.                 //配置 Channel  

    36.                 .channel(NioServerSocketChannel.class)  

    37.                 .childHandler(new ChannelInitializer<SocketChannel>() {   

    38.                         @Override  

    39.                         public void initChannel(SocketChannel ch) throws Exception {  

    40.                             // 注冊(cè)handler    

    41.                             ch.pipeline().addLast(new SimpleServerHandler());  

    42.                         }  

    43.                     })  

    44.                 .option(ChannelOption.SO_BACKLOG, 128)   

    45.                 .childOption(ChannelOption.SO_KEEPALIVE, true);   

    46.   

    47.             // 綁定端口,開始接收進(jìn)來的連接  

    48.             ChannelFuture f = b.bind(port).sync();  

    49.             // 等待服務(wù)器 socket 關(guān)閉 。  

    50.             f.channel().closeFuture().sync();  

    51.         } finally {  

    52.             workerGroup.shutdownGracefully();  

    53.             bossGroup.shutdownGracefully();  

    54.         }  

    55.     }  

    56.       

    57.     public static void main(String[] args) throws Exception {  

    58.         new SimpleServer(9999).run();  

    59.     }  

    60. }  

  3. SimpleServerHandler(服務(wù)端請(qǐng)求處理Handler)

    Java代碼  Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

     

    1. package com.yingjun.netty.server;  

    2.   

    3. import io.netty.buffer.ByteBuf;  

    4. import io.netty.channel.ChannelHandlerContext;  

    5. import io.netty.channel.ChannelInboundHandlerAdapter;  

    6.   

    7. public class SimpleServerHandler extends ChannelInboundHandlerAdapter {  

    8.   

    9.     @Override  

    10.     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  

    11.         System.out.println("SimpleServerHandler.channelRead");  

    12.         ByteBuf result = (ByteBuf) msg;  

    13.         byte[] result1 = new byte[result.readableBytes()];  

    14.         // msg中存儲(chǔ)的是ByteBuf類型的數(shù)據(jù),把數(shù)據(jù)讀取到byte[]中  

    15.         result.readBytes(result1);  

    16.         String resultStr = new String(result1);  

    17.         // 接收并打印客戶端的信息  

    18.         System.out.println("Client said:" + resultStr);  

    19.         // 釋放資源,這行很關(guān)鍵  

    20.         result.release();  

    21.   

    22.         // 向客戶端發(fā)送消息  

    23.         String response = "hello client!";  

    24.         // 在當(dāng)前場(chǎng)景下,發(fā)送的數(shù)據(jù)必須轉(zhuǎn)換成ByteBuf數(shù)組  

    25.         ByteBuf encoded = ctx.alloc().buffer(4 * response.length());  

    26.         encoded.writeBytes(response.getBytes());  

    27.         ctx.write(encoded);  

    28.         ctx.flush();  

    29.     }  

    30.   

    31.     @Override  

    32.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {  

    33.         // 當(dāng)出現(xiàn)異常就關(guān)閉連接  

    34.         cause.printStackTrace();  

    35.         ctx.close();  

    36.     }  

    37.   

    38.     @Override  

    39.     public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {  

    40.         ctx.flush();  

    41.     }  

    42.   

    43. }  

  4. SimpleServer(客戶端)

    Java代碼  Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

     

    1. package com.yingjun.netty.server;  

    2.   

    3. import io.netty.bootstrap.Bootstrap;  

    4. import io.netty.bootstrap.ServerBootstrap;  

    5. import io.netty.channel.ChannelFuture;  

    6. import io.netty.channel.ChannelInitializer;  

    7. import io.netty.channel.ChannelOption;  

    8. import io.netty.channel.EventLoopGroup;  

    9. import io.netty.channel.nio.NioEventLoopGroup;  

    10. import io.netty.channel.socket.SocketChannel;  

    11. import io.netty.channel.socket.nio.NioServerSocketChannel;  

    12. import io.netty.channel.socket.nio.NioSocketChannel;  

    13.   

    14. public class SimpleClient {  

    15.       

    16.     public void connect(String host, int port) throws Exception {  

    17.         EventLoopGroup workerGroup = new NioEventLoopGroup();  

    18.   

    19.         try {  

    20.             Bootstrap b = new Bootstrap();  

    21.             b.group(workerGroup);  

    22.             b.channel(NioSocketChannel.class);  

    23.             b.option(ChannelOption.SO_KEEPALIVE, true);  

    24.             b.handler(new ChannelInitializer<SocketChannel>() {  

    25.                 @Override  

    26.                 public void initChannel(SocketChannel ch) throws Exception {  

    27.                     ch.pipeline().addLast(new SimpleClientHandler());  

    28.                 }  

    29.             });  

    30.   

    31.             // Start the client.  

    32.             ChannelFuture f = b.connect(host, port).sync();  

    33.   

    34.             // Wait until the connection is closed.  

    35.             f.channel().closeFuture().sync();  

    36.         } finally {  

    37.             workerGroup.shutdownGracefully();  

    38.         }  

    39.     }  

    40.       

    41.     public static void main(String[] args) throws Exception {  

    42.         SimpleClient client=new SimpleClient();  

    43.         client.connect("127.0.0.1"9999);  

    44.     }  

    45.       

    46. }  

  5. SimpleServerHandler(客戶端請(qǐng)求處理Handler springmvc+mybatis+spring 整合 下載地址  

    Java代碼  Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

     

    1. package com.yingjun.netty.server;  

    2.   

    3. import io.netty.buffer.ByteBuf;  

    4. import io.netty.channel.ChannelHandlerContext;  

    5. import io.netty.channel.ChannelInboundHandlerAdapter;  

    6.   

    7. public class SimpleClientHandler extends ChannelInboundHandlerAdapter {  

    8.   

    9.     @Override  

    10.     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  

    11.         System.out.println("SimpleClientHandler.channelRead");    

    12.         ByteBuf result = (ByteBuf) msg;    

    13.         byte[] result1 = new byte[result.readableBytes()];    

    14.         result.readBytes(result1);    

    15.         System.out.println("Server said:" + new String(result1));    

    16.         result.release();    

    17.     }  

    18.   

    19.     @Override  

    20.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {  

    21.         // 當(dāng)出現(xiàn)異常就關(guān)閉連接  

    22.         cause.printStackTrace();  

    23.         ctx.close();  

    24.     }  

    25.   

    26.       

    27.     // 連接成功后,向server發(fā)送消息    

    28.     @Override    

    29.     public void channelActive(ChannelHandlerContext ctx) throws Exception {    

    30.         String msg = "hello Server!";    

    31.         ByteBuf encoded = ctx.alloc().buffer(4 * msg.length());    

    32.         encoded.writeBytes(msg.getBytes());    

    33.         ctx.write(encoded);    

    34.         ctx.flush();    

    35.     }    

    36. }  

  6. 運(yùn)行結(jié)果:

    Java代碼  Netty學(xué)習(xí):搭建一個(gè)簡(jiǎn)單的Netty服務(wù)

     

    1. SimpleClientHandler.channelRead  

    2. Server said:hello client!  

    3. ------------------------------------------  

    4. SimpleServerHandler.channelRead  

    5. Client said:hello Server!  

    6. SimpleServerHandler.channelRead  

    7. Client said:hello Server!  


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI