国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot整合netty的正確姿勢

這篇具有很好參考價(jià)值的文章主要介紹了springboot整合netty的正確姿勢。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

近期做一些物聯(lián)網(wǎng)方面項(xiàng)目,使用到了tcp協(xié)議,之前公司做過socket短連接,網(wǎng)上找了一個(gè)簡單的demo,很早便學(xué)習(xí)到nio方面知識,學(xué)習(xí)了《netty從入門到精通》這本書,同時(shí)也根據(jù)網(wǎng)上視頻做了幾個(gè)demo,但學(xué)習(xí)不太深入,剛好物聯(lián)網(wǎng)項(xiàng)目,就直接使用netty,前期直接使用這個(gè)框架,但作為近十年開發(fā)的java程序員,沒有spring感覺總少了很多不便,后期改框架時(shí)想到了使用springboot整合netty代碼。

先說之前項(xiàng)目中做socket代碼怎么用spring管理的:利用springboot啟動后啟動socket服務(wù),是沒有被spring管理的

public class CouponApplication {

    public static void main(String[] args) {
        log.info("當(dāng)前版本為:couponmisserver-0.0.5-SNAPSHOT");
        log.info("版本日期:2020-1-7");
        ApplicationContext context = SpringApplication.run(CouponApplication.class, args);
        //啟動stock服務(wù)
        Integer port = Integer.valueOf(Config.getConfig().get("socketPort"));
        SocketServer socketServer = new SocketServer();
        socketServer.init(port, context);
    }

}

網(wǎng)上一大神推薦的一個(gè)使用`CommandLineRunner `來加一個(gè)線程啟動netty

/**
 * author: hejz
 * data:  2022-5-9
 */
@SpringBootApplication
@Slf4j
@EnableScheduling
public class Application implements CommandLineRunner {
    @Autowired
    private NettyServer nettyServer;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        nettyServer.serverRun();
    }

}

我目前也是這樣做的,這樣netty就被整合到springboot中去了,但是近期chatGPT非?;?,晚上無聊時(shí)我也拿它來玩時(shí)問到它這個(gè)問題,看這個(gè)大神怎么回答的:

Spring Boot 中可以通過創(chuàng)建自定義的 NettyServerNettyClient 類,并在其中實(shí)現(xiàn) Netty 的服務(wù)端或客戶端代碼,然后在 Spring Boot 的應(yīng)用程序中將其作為一個(gè) Bean 注入到 Spring 容器中。以下是一個(gè)簡單的示例代碼,演示了如何整合 Netty 到 Spring Boot 應(yīng)用程序中。

首先,創(chuàng)建一個(gè)自定義的 NettyServer 類,用于實(shí)現(xiàn) Netty 的服務(wù)端代碼:

@Component
public class NettyServer {

    @Value("${netty.server.port}")
    private int port;

    @PostConstruct
    public void start() throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();
                            pipeline.addLast(new StringDecoder());
                            pipeline.addLast(new StringEncoder());
                            pipeline.addLast(new NettyServerHandler());
                        }
                    });

            ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
            channelFuture.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

}

之前網(wǎng)上那個(gè)大神給我的建議,我在操作過程中junit測試時(shí)總要先把啟動netty那個(gè)給注釋掉,無疑chatGPT大神給我找到了另一種解決方案,而且比我用的要好的多,我直接使用其給的方案重新優(yōu)化了代碼。

一、啟動類不要動,還是原來的springboot啟動類,在 NettyServer上使用@Component注解讓spring掃瞄管理,使用@PostConstruct注解直接運(yùn)行netty服務(wù)

@Component
@Slf4j
public class NettyServer {
    @Autowired
    private NettyServerInitializer nettyServerInitializer;
    @Value("${nettyPort}")
    private Integer nettyPort;
    @PostConstruct
    public void serverRun() {
        //循環(huán)組接收連接,不進(jìn)行處理,轉(zhuǎn)交給下面的線程組
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        //循環(huán)組處理連接,獲取參數(shù),進(jìn)行工作處理
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            //服務(wù)端進(jìn)行啟動類
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            //使用NIO模式,初始化器等等
            serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(nettyServerInitializer);
            //綁定端口
            ChannelFuture channelFuture = serverBootstrap.bind(nettyPort).sync();
            log.info("tcp服務(wù)器已經(jīng)啟動…………");
            channelFuture.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

二、添加NettyServerInitializer類加上@Component注解讓spring掃瞄管理,使用@Autowired進(jìn)行依賴注入管理

@Component
public class NettyServerInitializer extends ChannelInitializer<SocketChannel> {
    Logger log = LogManager.getLogger(NettyServerInitializer.class);
    @Autowired
    private NettyHandler nettyHandler;

    //連接注冊,創(chuàng)建成功,會被調(diào)用
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        log.info("==================netty報(bào)告==================");
        log.info("信息:有一客戶端鏈接到本服務(wù)端");
        log.info("IP:{}", ch.remoteAddress().getAddress());
        log.info("Port:{}", ch.remoteAddress().getPort());
        log.info("通道id:{}", ch.id().toString());
        log.info("==================netty報(bào)告完畢==================");
        ChannelPipeline pipeline = ch.pipeline();
        //定義讀寫空閑時(shí)間——(單位秒)
        pipeline.addLast(new IdleStateHandler(180, 60,180));
        //注冊攔截器
        pipeline.addLast(nettyHandler);
    }
}

三、其它NettyServerHandler類加上@Component注解讓spring掃瞄管理,使用@Autowired進(jìn)行依賴注入管理,但注意需要添加@ChannelHandler.Sharable注解,防止程序報(bào)錯(cuò)

/**
 * @author:hejz 75412985@qq.com
 * @create: 2023-01-24 22:51
 * @Description: 注冊攔截器——每個(gè)設(shè)備都需要注冊
 */
@Component
@ChannelHandler.Sharable
@Slf4j
public class NettyHandler extends SimpleChannelInboundHandler<ByteBuf> {
    @Autowired
    private DtuRegister dtuRegister;   

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
       //讀到的客戶端信息的邏輯處理(略)
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.getCause();
        NettyServiceCommon.deleteKey(ctx.channel());
        ctx.channel().close();
    }
}

至此,springboot整合netty完美解決,這才是便于理解和操作的方式,感謝網(wǎng)上使用監(jiān)聽器啟動netty服務(wù)的那位大神,也感謝chatGPT大神給我提供另一種好的思路和方法文章來源地址http://www.zghlxwxcb.cn/news/detail-448387.html

到了這里,關(guān)于springboot整合netty的正確姿勢的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Springboot整合Netty,自定義協(xié)議實(shí)現(xiàn)

    Springboot整合Netty,自定義協(xié)議實(shí)現(xiàn)

    新建springboot項(xiàng)目,并在項(xiàng)目以來中導(dǎo)入netty包,用fastjson包處理jsonStr。 創(chuàng)建netty相關(guān)配置信息文件 yml配置文件—— application.yml netty配置實(shí)體類—— NettyProperties 與yml配置文件綁定 通過 @ConfigurationProperties(prefix = \\\"netty\\\") 注解讀取配置文件中的netty配置,通過反射注入值,需要在

    2024年02月06日
    瀏覽(27)
  • SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送

    ? ? ? ?Netty是一個(gè)高性能、異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶端。以下是Netty的主要優(yōu)勢: 高性能 :Netty基于NIO(非阻塞IO)模型,采用事件驅(qū)動的設(shè)計(jì),具有高性能的特點(diǎn)。它通過零拷貝技術(shù)、內(nèi)存池化技術(shù)等手段,進(jìn)一步提高

    2024年01月20日
    瀏覽(21)
  • Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器

    Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器

    try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss, worker) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new IdleStateHandler(0, 0, 60)); pipeline.addLast(new JsonDecoder()); pipeline.addLast(new JsonEnco

    2024年04月09日
    瀏覽(26)
  • 日常記錄-SpringBoot整合netty-socketio

    日常記錄-SpringBoot整合netty-socketio

    這次整合借鑒了以下博主的智慧 websocket和socketio的區(qū)別 socket.io.js最簡版單頁HTML測試工具 Netty-SocketIO多路復(fù)用 springboot學(xué)習(xí)(四十三) springboot使用netty-socketio實(shí)現(xiàn)消息推送 SpringBoot集成SocketIO socketio的核心依賴就只有這個(gè) 我在啟動類里面定義了啟動或者關(guān)閉SocketIOServer springboot整合

    2024年02月10日
    瀏覽(17)
  • netty學(xué)習(xí)(3):SpringBoot整合netty實(shí)現(xiàn)多個(gè)客戶端與服務(wù)器通信

    netty學(xué)習(xí)(3):SpringBoot整合netty實(shí)現(xiàn)多個(gè)客戶端與服務(wù)器通信

    創(chuàng)建一個(gè)SpringBoot工程,然后創(chuàng)建三個(gè)子模塊 整體工程目錄:一個(gè)server服務(wù)(netty服務(wù)器),兩個(gè)client服務(wù)(netty客戶端) pom文件引入netty依賴,springboot依賴 NettySpringBootApplication NettyServiceHandler SocketInitializer NettyServer NettyStartListener application.yml Client1 NettyClientHandler SocketInitializ

    2024年02月11日
    瀏覽(56)
  • Springboot中整合netty啟動后,項(xiàng)目無法正常啟動?

    Springboot中整合netty啟動后,項(xiàng)目無法正常啟動?

    ? 1.現(xiàn)象描述 netty等一般放在程序啟動后再啟動,多以下面方式啟動: 如果在 Order 后面還有其它模塊被啟動,那么其它模塊就會被阻塞。 2.原因分析 主線程啟動netty后,netty會將主線程阻塞。因此,需要采用異步方式或使用線程池來啟動netty。 3.解決辦法 添加異步注解@Async

    2024年02月13日
    瀏覽(23)
  • 【已解決】SpringBoot整合security賬號密碼正確卻提示錯(cuò)誤

    【已解決】SpringBoot整合security賬號密碼正確卻提示錯(cuò)誤

    SpringSecurity的密碼校驗(yàn)并不是直接使用原文進(jìn)行比較,而是使用加密算法將密碼進(jìn)行加密(更準(zhǔn)確地說應(yīng)該進(jìn)行Hash處理,此過程是不可逆的,無法解密),最后將用戶提供的密碼以同樣的方式加密后與密文進(jìn)行比較。對于我們來說,用戶提供的密碼屬于隱私信息,直接明文存

    2024年02月11日
    瀏覽(27)
  • SpringBoot項(xiàng)目整合WebSocket+netty實(shí)現(xiàn)前后端雙向通信(同時(shí)支持前端webSocket和socket協(xié)議哦)

    SpringBoot項(xiàng)目整合WebSocket+netty實(shí)現(xiàn)前后端雙向通信(同時(shí)支持前端webSocket和socket協(xié)議哦)

    目錄 ? 前言 技術(shù)棧 功能展示 一、springboot項(xiàng)目添加netty依賴 二、netty服務(wù)端 三、netty客戶端 四、測試 五、代碼倉庫地址 ??專屬小彩蛋:前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站(前言 - 床長人工智能教程

    2024年02月12日
    瀏覽(22)
  • 【NO.1】近期在項(xiàng)目中遇到的一些實(shí)際問題

    發(fā)現(xiàn)還是寫博客能讓自己記錄問題比較規(guī)律,開個(gè)博實(shí)時(shí)更新自己每天遇到的問題吧。 將地址設(shè)置為了淘寶鏡像,但使用npm安裝還是卡在這一步,或者一段時(shí)間后安裝失敗,最終使用cnpm安裝處理好了,咱也不懂為啥,就這么處理吧。 查了下兩者的區(qū)別:npm是node官方的包管理

    2024年02月04日
    瀏覽(35)
  • 符號化的正確姿勢

    符號化的正確姿勢

    將 .ips crash report 文件拖放到 Xcode Window Devices and Simulators View Device Logs 中, 然后導(dǎo)出 .crash 符號化文件. 使用條件: crash report 對應(yīng)的 Archive 包是在本機(jī)構(gòu)建的 symbolicatecrash 是一個(gè) exec (可執(zhí)行文件), Xcode自帶, iOS 15 之前的系統(tǒng)產(chǎn)生的 crash report, 可以直接被整個(gè)符號化, 文件路徑可以

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包