亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

Netty學(xué)習(xí):搭建一個(gè)簡單的Netty服務(wù)(JAVA NIO 類庫的異步通信框架)

來源:zzy7075 發(fā)布時(shí)間:2018-11-21 15:54:15 閱讀量:1102

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

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

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

一. Netty 的優(yōu)點(diǎn):

  • API 使用簡單,開發(fā)門檻低;

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

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

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

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

  • 經(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代碼  收藏代碼
    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代碼  收藏代碼
    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中,通訊的雙方建立連接后,會把數(shù)據(jù)按照ByteBuf的方式進(jìn)行傳輸, 

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

    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.             //啟動 NIO 服務(wù)的輔助啟動類  

    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.                             // 注冊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ù)端請求處理Handler)

    Java代碼  收藏代碼
    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中存儲的是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)前場景下,發(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代碼  收藏代碼
    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(客戶端請求處理Handler)

    Java代碼  收藏代碼
    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代碼  收藏代碼
    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!  



標(biāo)簽: 服務(wù)器搭建
分享:
評論:
你還沒有登錄,請先