文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springboot 整合netty

2023-10-08 07:13

关注

增加netty依赖

                    io.netty        netty-all        4.1.28.Final    

创建netty init 类

public class WsServerInitializer extends ChannelInitializer {        @Override        protected void initChannel(SocketChannel ch) throws Exception {            ChannelPipeline pipeline = ch.pipeline();            //websocket基于http协议,所以需要http编解码器            pipeline.addLast(new HttpServerCodec());                        //添加对于读写大数据流的支持            pipeline.addLast(new ChunkedWriteHandler());                        //对httpMessage进行聚合            pipeline.addLast(new HttpObjectAggregator(1024*64));            // ================= 上述是用于支持http协议的 ==============            //websocket 服务器处理的协议,用于给指定的客户端进行连接访问的路由地址            //比如处理一些握手动作(ping,pong) 等同于访问路劲            pipeline.addLast(new WebSocketServerProtocolHandler("/heart/api/v1"));            //自定义handler            pipeline.addLast(new ChatHandler());    }}

netty 启动类

@Component@Slf4jpublic class WsServer {                public static class SingletonServer{            static final WsServer INSTANCE = new WsServer();        }        public static WsServer getInstance(){            return SingletonServer.INSTANCE;        }        private EventLoopGroup mainGroup ;        private EventLoopGroup subGroup;        private ServerBootstrap server;        private ChannelFuture future;        public WsServer(){            mainGroup = new NioEventLoopGroup();            subGroup = new NioEventLoopGroup();            //添加自定义初始化处理器            server = new ServerBootstrap();            server.group(mainGroup, subGroup)            .channel(NioServerSocketChannel.class)            .childHandler(new WsServerInitializer());        }        public void start(Integer port){            future = this.server.bind(port);        }}

 3.启动netty

@SpringBootApplicationpublic class Application{    public static void main(String[] args){        SpringApplication.run(Application.class,args);        //7888 是netty 占用的端口        WsServer.getInstance().start(7888);    }}

 4.接收代码

@Component@Slf4jpublic class ChatHandler extends SimpleChannelInboundHandler {        private static ChannelGroup CLIENTS =            new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);        @Override    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {        CLIENTS.add(ctx.channel());    }        @Override    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {          CLIENTS.remove(ctx.channel());    }    @Transactional(rollbackFor = Exception.class)    @Override    public void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {                //接收客户端发送的信息                System.out.println(msg.text());        //发送客户端的消息         ctx.channel().writeAndFlush(new TextWebSocketFrame("发送心跳"));    }        @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {        log.error("心跳异常:",cause);        CLIENTS.remove(ctx.channel());    }}

netty 自带定时器 这里只举个例子 定时器不在spring管理中举读取的定时发送

@Component@Slf4jpublic class ChatHandler extends SimpleChannelInboundHandler {        private static ChannelGroup CLIENTS =            new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);       @Autowired    private RestTemplate restTemplate;        @Override    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {        CLIENTS.add(ctx.channel());    }        @Override    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {          CLIENTS.remove(ctx.channel());    }    @Transactional(rollbackFor = Exception.class)    @Override    public void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {                //接收客户端发送的信息                System.out.println(msg.text());        ctx.channel().eventLoop().scheduleWithFixedDelay(new Runnable()  {           ChannelHandlerContext ctx;        RestTemplate restTemplate;         @Override            public void run() {}//对自身属性进行赋值            public Runnable accept(ChannelHandlerContext c, RestTemplate restTemplate) {                this.ctx = c;                this.restTemplate= restTemplate;                return this;   //0 是延迟多少秒执行 后面两个参数时多长时间执行一次            }}.accept(ctx,restTemplate),0,1, TimeUnit.MINUTES);    }        @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {        log.error("心跳异常:",cause);        CLIENTS.remove(ctx.channel());    }}

来源地址:https://blog.csdn.net/weixin_56576835/article/details/129992578

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯