最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty簡單的入門代碼示例

 更新時間:2023年12月21日 10:34:30   作者:Colins~  
這篇文章主要介紹了Netty簡單的入門代碼示例,Netty 的內(nèi)部實現(xiàn)是很復雜的,但是 Netty 提供了簡單易用的API從網(wǎng)絡(luò)處理代碼中解耦業(yè)務(wù)邏輯,Netty 是完全基于 NIO 實現(xiàn)的,所以整個 Netty 都是異步的,需要的朋友可以參考下

前言

純Java幾種網(wǎng)絡(luò)IO的開發(fā)步驟及示例,毫無疑問最好的就是NIO,這也是目前最主流的方式,但是這玩意編寫復雜,拓展性也不強,在通信上方方面面都需要重寫,這不是一般人能搞得定了,所以呀我們得會用框架呀,Netty就是這方面框架中的佼佼者!

基礎(chǔ)示例入門

服務(wù)端

NettyServer.class

@Slf4j
public class NettyServer{
    //1.創(chuàng)建線程組  bossGroup:連接線程   workGroup:工作線程
    private final NioEventLoopGroup bossGroup = new NioEventLoopGroup();
    private final NioEventLoopGroup workerGroup = new NioEventLoopGroup();
    public void serverStart() throws InterruptedException {
        try{
            // 服務(wù)端啟動類
            ServerBootstrap bootstrap = new ServerBootstrap();
            // 傳入兩個線程組
            bootstrap.group(bossGroup, workerGroup)
                    // 指定Channel 和NIO一樣是采用Channel通道的方式通信 所以需要指定服務(wù)端通道
                    .channel(NioServerSocketChannel.class)
                    //使用指定的端口設(shè)置套接字地址
                    .localAddress(new InetSocketAddress(11111))
                    //服務(wù)端可連接隊列數(shù),對應TCP/IP協(xié)議listen函數(shù)中backlog參數(shù)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    //設(shè)置數(shù)據(jù)處理器
                    .childHandler(new ChannelInitializer<Channel>() {
                        @Override
                        protected void initChannel(Channel channel) throws Exception {
                            // 在管道中 添加數(shù)據(jù)處理類
                            channel.pipeline().addLast(new NettyServerTestHandler());
                        }
                    });
            // 同步等待成功
            ChannelFuture future = bootstrap.bind().sync();
            if (future.isSuccess()) {
                log.info("啟動 Netty Server 成功");
            }
            //等待服務(wù)端監(jiān)聽端口關(guān)閉 鏈路關(guān)閉后main函數(shù)才會結(jié)束
            future.channel().closeFuture().sync();
        }finally {
            // 優(yōu)雅的關(guān)閉 釋放資源
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        new NettyServer().serverStart();
    }
}

看上去好多,感覺比NIO還麻煩?其實很方便的:

  1. 實例化一個服務(wù)端 ServerBootstrap ,這個NIO也一樣,Netty幫我們封裝了
  2. 設(shè)置兩個線程組,一個處理客戶端連接事件,一個處理連接后數(shù)據(jù)處理事件
  3. 指定服務(wù)端通道類型,并綁定地址
  4. 設(shè)置傳輸?shù)囊恍┡渲脜?shù)(這里有很多可以設(shè)置,所以拓展性強)
  5. 設(shè)置數(shù)據(jù)處理器,這里實際是添加了一個數(shù)據(jù)處理管道,管道內(nèi)可以有很多數(shù)據(jù)處理類,所以可以一層一層處理,可插拔式設(shè)計(類似攔截器鏈)
channel.pipeline() : 這就是管道
new NettyServerTestHandler() : 這個就是管道里的一個數(shù)據(jù)處理類
// 數(shù)據(jù)處理類可以有多個
  • 最后啟動

ServerBootstrap 實例化后,都是采用建造者模式設(shè)置的,對于我們來說是非常的方便的,這里配置好后我們的重心就可以放在數(shù)據(jù)處理類上了

NettyServerTestHandler.class

NettyServerTestHandler 就是數(shù)據(jù)處理類,所有的方法都幫我們封裝好了,我們不需要考慮其中調(diào)用的問題,方法是處理什么事件的,我們寫對應的邏輯就好了,方法上的ChannelHandlerContext 可以理解為管道中所有數(shù)據(jù)處理類的紐帶,比如攔截器鏈不也有么

@Slf4j
public class NettyServerTestHandler extends ChannelInboundHandlerAdapter {
    // 讀取信息調(diào)用
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 和NIO一樣有緩沖區(qū) ByteBuf就是對ByteBuffer做了一層封裝
        ByteBuf msg1 = (ByteBuf) msg;
        log.info("客戶端信息:" + msg1.toString(CharsetUtil.UTF_8));
    }
    // 連接事件 連接成功調(diào)用
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        SocketAddress socketAddress = ctx.channel().remoteAddress();
        log.info(socketAddress + " 已連接");
        // 發(fā)送數(shù)據(jù)
        ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Client", CharsetUtil.UTF_8));
    }
    // 斷開連接調(diào)用
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.info(ctx.channel().remoteAddress() + " 已斷開連接");
    }
    // 讀取信息完成事件  信息讀取完成后調(diào)用
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    }
    // 異常處理  發(fā)生異常調(diào)用
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 異常后 關(guān)閉與客戶端連接
        ctx.close();
    }
}

客戶端

NettyClient.class

客戶端啟動和服務(wù)端幾乎一致,只不過啟動類成了Bootstrap ,而且我還加入了一個斷連邏輯

@Slf4j
public class NettyClient  {
    private EventLoopGroup group = new NioEventLoopGroup();
    private int port=11111;
    private String host="127.0.0.1";
    public void start() throws InterruptedException {
        try{
            Bootstrap bootstrap = new Bootstrap();
            // 客戶端不需要處理連接 所以一個線程組就夠了
            bootstrap.group(group)
                    // 連接通道
                    .channel(NioSocketChannel.class)
                    .remoteAddress(host, port)
                    .option(ChannelOption.TCP_NODELAY, true)
                    // 數(shù)據(jù)處理
                    .handler(new ChannelInitializer<Channel>() {
                        @Override
                        protected void initChannel(Channel channel) throws Exception {
                            channel.pipeline().addLast(new NettyClientTestHandler());
                        }
                    });
            ChannelFuture future = bootstrap.connect();
            //客戶端斷線重連邏輯
            future.addListener((ChannelFutureListener) future1 -> {
                if (future1.isSuccess()) {
                    log.info("連接Netty服務(wù)端成功");
                } else {
                    log.info("連接失敗,進行斷線重連");
                    future1.channel().eventLoop().schedule(() -> {
                        try {
                            start();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }, 20, TimeUnit.SECONDS);
                }
            });
            future.channel().closeFuture().sync();
        }catch (Exception e){
            log.info("服務(wù)端異常");
        }finally {
            group.shutdownGracefully();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        new NettyClient().start();
    }
}

NettyClientTestHandler.class

數(shù)據(jù)處理類也是一樣的

@Slf4j
public class NettyClientTestHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf msg1 = (ByteBuf) msg;
        log.info("服務(wù)端信息:" + msg1.toString(CharsetUtil.UTF_8));
    }
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 連接上 就給服務(wù)端發(fā)送數(shù)據(jù)
        ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Server", CharsetUtil.UTF_8));
        SocketAddress socketAddress = ctx.channel().remoteAddress();
        log.info(socketAddress + " 已連接");
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.info(ctx.channel().remoteAddress() + " 已斷開連接");
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}

到此這篇關(guān)于Netty簡單的入門代碼示例的文章就介紹到這了,更多相關(guān)Netty入門代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于springboot的RestTemplate、okhttp和HttpClient對比分析

    基于springboot的RestTemplate、okhttp和HttpClient對比分析

    這篇文章主要介紹了基于springboot的RestTemplate、okhttp和HttpClient對比分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java中Arraylist的最大長度

    Java中Arraylist的最大長度

    這篇文章主要介紹了Java中Arraylist的最大長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • jar包沖突常用的解決方案

    jar包沖突常用的解決方案

    引言在使用java語言開發(fā),maven做項目管理時,我們經(jīng)常遇到一個頭疼的問題就是jar包沖突,這篇文章主要給大家介紹了關(guān)于jar包沖突常用的解決方案,需要的朋友可以參考下
    2023-12-12
  • SpringSecurity權(quán)限控制實現(xiàn)原理解析

    SpringSecurity權(quán)限控制實現(xiàn)原理解析

    這篇文章主要介紹了SpringSecurity權(quán)限控制實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 全面解析JPA?倉庫repository中的findAll()方法

    全面解析JPA?倉庫repository中的findAll()方法

    這篇文章主要介紹了全面解析JPA?倉庫repository中的findAll()方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot接口如何統(tǒng)一異常處理

    SpringBoot接口如何統(tǒng)一異常處理

    這篇文章主要介紹了SpringBoot接口如何統(tǒng)一異常處理,SpringBoot接口如何對異常進行統(tǒng)一封裝,并統(tǒng)一返回呢?以下文的參數(shù)校驗為例,如何優(yōu)雅的將參數(shù)校驗的錯誤信息統(tǒng)一處理并封裝返回呢,感興趣的下下伙伴可以一同參考一下
    2022-07-07
  • java中接口冪等性的五種實現(xiàn)方法

    java中接口冪等性的五種實現(xiàn)方法

    在java中保證接口冪等性,即多次調(diào)用同一接口產(chǎn)生與單次調(diào)用相同的結(jié)果,不會引發(fā)副作用,需要結(jié)合業(yè)務(wù)場景選擇合適的方案,下面就來介紹五種實現(xiàn)方法,感興趣的可以了解一下
    2025-09-09
  • SpringCloud?Gateway實現(xiàn)請求解密和響應加密的過程解析

    SpringCloud?Gateway實現(xiàn)請求解密和響應加密的過程解析

    這篇文章主要介紹了SpringCloud?Gateway實現(xiàn)請求解密和響應加密的相關(guān)知識,本文環(huán)境使用比較新的?Java?17?和?SpringBoot?3.1.5,對應到Spring的版本是?6.0.13,本文重心是網(wǎng)關(guān)項目,需要的朋友可以參考下
    2023-11-11
  • 將本地的jar包打到Maven的倉庫中實例

    將本地的jar包打到Maven的倉庫中實例

    下面小編就為大家分享一篇將本地的jar包打到Maven的倉庫中實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Java動態(tài)代理機制的實例詳解

    Java動態(tài)代理機制的實例詳解

    這篇文章主要介紹了 Java動態(tài)代理機制的實例詳解的相關(guān)資料,希望通過本文大家能夠掌握動態(tài)代理機制,需要的朋友可以參考下
    2017-09-09

最新評論

柯坪县| 叙永县| 格尔木市| 五指山市| 湘乡市| 襄汾县| 赫章县| 上蔡县| 新蔡县| 新津县| 哈尔滨市| 巴马| 赣州市| 甘泉县| 克山县| 图们市| 惠水县| 大邑县| 古蔺县| 虹口区| 开封县| 广灵县| 海丰县| 华坪县| 政和县| 山东| 青冈县| 凤山县| 长阳| 沭阳县| 海宁市| 徐闻县| 双柏县| 阳泉市| 邻水| 桐乡市| 安溪县| 涿鹿县| 吴川市| 慈溪市| 沙雅县|