nettyspringboot开发即时通讯系统

news2024/11/29 4:41:50

Netty 和 Spring Boot 是当今应用最广泛的 Java 技术之一,两个框架的集成能够构建出高效、稳定并且易于扩展的即时通讯系统。在本篇文章中,我们将会学习和探讨 Netty 和 Spring Boot 的整合,并且演示如何使用它们来构建一个高效、实时的即时通讯系统。

 

  1. Netty 简介
    Netty 是一个基于 NIO 的客户端/服务端网络应用框架,它可以帮助程序员快速地开发高性能、高可靠性的网络应用程序。Netty 致力于解决 Java 网络编程的复杂性问题,提供更加容易使用的 API。Netty 的主要特点有:
    - 高度的可定制性
    Netty 提供了一系列的工具和组件,使程序员可以更容易地构建出定制化的网络应用程序。
    - 可扩展性
    Netty 提供了一种方便的模块化设计。程序员可以通过在应用程序中调用一些简单的API,来实现新的功能或强化现有的功能。开发即时通讯咨询小蓝豆
    - 高性能
    Netty 是一个异步、事件驱动的框架。通过使用 NIO,它可以处理大量的并发连接,而不会占用大量的系统资源。
  2. Spring Boot 简介
    Spring Boot 是一个基于Spring框架的开发平台,它可以帮助程序员快速地构建出高效、稳定的应用程序。Spring Boot 的主要特点有:
    - 自动配置
    Spring Boot 可以根据应用程序的需求来自动配置各种环境,并且提供多种不同的设置以修改或者覆盖这些自动配置。
    - 简单易用
    Spring Boot 采用“约定优于配置”的原则,避免了繁琐的 XML 配置,从而简化了应用开发过程。
    - 组件化
    Spring Boot 针对不同的应用场景和需求提供了丰富的组件,使程序员可以方便地构建出自己的应用。同时,Spring Boot 还支持基于插件的扩展机制,这样程序员可以针对具体的场景定制自己的扩展。
  3. Netty 和 Spring Boot 的整合
    将 Netty 和 Spring Boot 集成在一起,可以使开发者获得这两个框架的优点,并且可以方便地构建出稳定、高效、易于扩展的应用程序。下面是一个基于 Netty 和 Spring Boot 的即时通讯系统的例子:
    首先,需要通过 Maven 把 Spring Boot 和 Netty 的支持包引入到 pom.xml 文件中:
    ```
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.9.Final</version>
    </dependency>
    ```
    然后,需要编写一个配置类来启动 Netty 服务:
    ```
    @Configuration
    public class NettyConfig {
    @Autowired
    private NettyServerHandler nettyServerHandler;
    @Autowired
    private EchoHandler echoHandler;
    @Bean
    public EventLoopGroup bossGroup() {
    return new NioEventLoopGroup();
    }
    @Bean
    public EventLoopGroup workerGroup() {
    return new NioEventLoopGroup();
    }
    @Bean
    public ServerBootstrap serverBootstrap() {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup(), workerGroup())
    .channel(NioServerSocketChannel.class)
    .option(ChannelOption.SO_BACKLOG, 128)
    .childOption(ChannelOption.SO_KEEPALIVE, true)
    .childHandler(new ChannelInitializer<SocketChannel>() {
    protected void initChannel(SocketChannel socketChannel) throws Exception {
    ChannelPipeline pipeline = socketChannel.pipeline();
    pipeline.addLast(nettyServerHandler);
    pipeline.addLast(echoHandler);
    }
    });
    return serverBootstrap;
    }
    @Bean(destroyMethod = "shutdownGracefully")
    public void shutDownGracefully() {
    bossGroup().shutdownGracefully();
    workerGroup().shutdownGracefully();
    }
    }
    ```
    得益于 Spring Boot 的自动配置机制,上述代码将在应用程序启动时自动加载并准备好 Netty 服务。这种方式极大地简化了配置的过程,并且大大减少了错误的出现概率,并且可以充分利用 Spring Boot 的其他特性。
  4. 实现即时通讯功能
    现在可以实现一个简单的即时通讯应用程序了。下面是服务器端代码:
    ```
    @Component
    @ChannelHandler.Sharable
    public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    private final NettyConnectManager nettyConnectManager;
    public NettyServerHandler(NettyConnectManager nettyConnectManager) {
    this.nettyConnectManager = nettyConnectManager;
    }
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
    nettyConnectManager.add(ctx.channel());
    System.out.println("Connection established: " ctx.channel().remoteAddress());
    super.channelActive(ctx);
    }
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    super.channelRead(ctx, msg);
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    System.out.println("Client connection closed unexpectedly:" ctx.channel().remoteAddress());
    nettyConnectManager.remove(ctx.channel());
    super.exceptionCaught(ctx, cause);
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    System.out.println("Client connection closed:" ctx.channel().remoteAddress());
    nettyConnectManager.remove(ctx.channel());
    super.channelInactive(ctx);
    }
    }
    ```
    ```
    @Service
    public class NettyConnectManager {
    private final ConcurrentMap<String, Channel> connections = new ConcurrentHashMap<>();
    public void add(Channel channel) {
    connections.put(channel.id().asShortText(), channel);
    }
    public void remove(Channel channel) {
    connections.remove(channel.id().asShortText());
    System.out.println("Client disconnected: " channel.remoteAddress());
    }
    public void broadcast(String message) {
    connections.values().forEach(ch -> ch.writeAndFlush(new TextWebSocketFrame(message)));
    }
    }
    ```
    上面的代码根据连接和断开连接的情况,管理和存储当前的客户端连接。当每一个客户端连接上服务器之后,NettyServerHandler 的 channelActive() 会被调用,这里我们把会话 channel 存储到 NettyConnectManager 中,之后便可以进行数据的广播。
    下面是客户端的 WebSocket 配置:
    ```
    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/topic");
    registry.setApplicationDestinationPrefixes("/app");
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/websocket").withSockJS();
    }
    }
    ```
    下面实现一个简单的 Web 应用程序,并且开发一个 WebSocket 控制器,用于处理客户端发来的消息。
    ```
    @Controller
    public class ChatroomController {
    @Autowired
    private NettyConnectManager nettyConnectManager;
    @GetMapping("/")
    public String indexPage() {
    return "index";
    }
    @MessageMapping("/chat")
    @SendTo("/topic/chat")
    public ChatMessage messageReceived(ChatMessage message) throws Exception {
    nettyConnectManager.broadcast(message.getContent());
    return message;
    }
    }
    ```
    ChatMessage 是一个简单的数据对象,用于表示聊天信息。
    ```
    public class ChatMessage {
    private String content;
    public String getContent() {
    return content;
    }
    public void setContent(String content) {
    this.content = content;
    }
    }
    ```
    WebSocket 的控制器 ChatroomController 采用了 @MessageMapping 注解,这个注解指定了一个 to 消息头,这个消息头可以让客户端发送消息到当前的控制器上,并且指定了被路由到 /topic/chat 上的 SendTo 注解。当客户端发送一个消息时,NettyConnectManager 的 broadcast() 方法会广播这条消息给当前连接上的所有客户端,要注意的是,这个方法是在不同线程中被调用的。
  5. 总结

本文涵盖了 Netty 和 Spring Boot 整合的基本知识和实践技巧,同时展示了如何使用这两个框架来构建一个高效的即时通讯系统。这个简单的应用程序是一个很好的起点,你也可以将它扩展或修改成一个更加复杂、功能更加强大的应用程序。不管使用怎样的框架或技术,构建更好的应用程序的关键还在于对问题的深入了解和对客户需求的理解。因此,与自己的需求和情况相匹配的方案才是最佳选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浓缩咖啡会降低2型糖尿病风险?

咖啡是全球消费最频繁的饮料之一&#xff0c;其潜在的健康效应引发了重要的科学研究。先前的研究已经将更高的咖啡摄入量与较低的T2D风险联系起来&#xff0c;但潜在机制仍不清楚。 一项新研究揭示&#xff0c;咖啡有助于降低2型糖尿病的风险。研究人员发现&#xff0c;每天增加…

安装endnote 之后打开word出现乱码

文章目录 1 安装endnote 之后打开word出现乱码3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程&#xff08;毕业论文参考文献管理器&#xff09; 1 安装endnote 之后打开word出现乱码 安装了endnote&#xff0c;打开文档后&#xff0c;目录显示这样&#xff…

虹科案例 | 对症下药,零售行业商业智能分析解决方案及应用案例!

零售行业商业智能分析解决方案 Domo为零售、电子商务、物联网等提供数据洞察力 利用数字增强数字程序的应用 -快速迭代并指导数字化程序的应用。 -有效管理“最后一公里”并降低交付成本。 -优化客户体验并不断适应客户的新需求&#xff0c;例如线下实体店可进行在线退货。…

【Hackthebox Stocker】打靶记录

Hackthebox Stocker nmap 扫描一把 得到tcp端口22 80 nmap -sC -sV 10.10.11.196 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-10 05:51 EDT Nmap scan report for 10.10.11.196 Host is up (0.25s latency). Not shown: 998 closed tcp ports (reset) PORT STAT…

C++:C++Primer Plus(第六版):Chapter16 : string类和标准模板库:智能指针

Chapter16.2 : 智能指针模板类 1.指针指针现实需求1.1 普通指针弊端 1.2 智能指针现实需求2. 智能指针使用范式2.1 下面演绎三种智能指针用法注意一个问题 3. 三种智能指针特点3.1 为何摒弃 auto_ptr 3.2 选用 unique_ptr3.3 选用 shared_ptr4. 应该使用哪种智能指针 本章节我们…

学好数据结构的秘诀

学好数据结构的秘诀 作为计算机专业的一名“老兵”&#xff0c;笔者从事数据结构和算法的研究已经近20余年了&#xff0c;在学习的过程中&#xff0c;也会遇到一些问题&#xff0c;但在解决问题时&#xff0c;积累了一些经验&#xff0c;为了让读者在学习数据结构的过程中少走…

Vue2全家桶 (Vue2、VueRouter、Vuex) 笔记

前言 有错的地方希望大家能够帮忙指正一下&#xff1b;本文只是对Vue2全家桶的基本语法进行记录。给孩子点点关注吧&#xff01;&#x1f62d; 壹、Vue2 Vue&#xff1a;一个 JavaScript 渐进式框架&#xff1b; 渐进式&#xff1a;逐渐使用&#xff0c;集合更多的功能&am…

一文总结 Google I/O 2023

今日凌晨举行的谷歌 I / O 2023 开发者大会上&#xff0c;如果说和往年有什么不同&#xff0c;那么应该就是更大力度的 All in AI 。 毕竟在去年 I/O 宣布重点投入 AI 之后&#xff0c;年末却被 OpenAI 的 ChatGPT “越塔偷家”&#xff0c;匆忙攒出一个发布会还让 Bard 爆出事…

国内最大规模上云实践 | 鹅厂如何在云原生2.0时代“挖呀挖”?

&#x1f449;腾小云导读 2022 年 10 月&#xff0c;腾讯自研业务产品全面完成云原生上云。自研业务产品云上规模已突破 5000w CPU&#xff0c;借助云原生的技术优势&#xff0c;全面提升了腾讯自研业务产品的运营效率&#xff0c;在此过程中我们也对腾讯云产品进行了打磨和验证…

适合Python 初学者入门教程和资源

如果您是 Python 的初学者&#xff0c;以下是一些入门教程和资源可以帮助您快速开始&#xff1a; 1、Python 官方教程: Python 官方网站提供了完整的入门教程&#xff0c;包括语言基础、面向对象编程、模块、文件处理等方面的内容。这是一个非常全面和权威的资源。 2、Codecade…

盖雅工场重磅发布「劳动力账户」,助力企业实现全面工时成本管理

2023年5月10日&#xff0c;亚太地区领先的劳动力管理云服务商盖雅工场宣布&#xff0c;在原有的智能排班和实时考勤系统基础之上&#xff0c;正式推出全新模块「劳动力账户」&#xff0c;通过为企业里的每一位员工建立劳动力账户&#xff0c;实现工时与成本的全面管控&#xff…

一文打通原生Shiro使用

目录 环境准备 添加依赖 INI 文件 登录认证 登录认证概念 登录认证基本流程 登录认证实例 身份认证流程 角色、授权 授权概念 授权方式 授权流程 授权实例 Shiro 加密 Shiro 自定义登录认证 环境准备 Shiro不依赖容器&#xff0c;直接创建maven工程即可 添加依…

机器学习——线性回归

机器学习——线性回归 文章目录 机器学习——线性回归[toc]1 模型设定2 训练模型3 模型预测4 交叉验证 基于Python实现线性回归、预测和建模评估。 1 模型设定 以Boston数据集为例&#xff0c;其中MEDV是标签&#xff0c;其余均为特征变量 CRIM per capita crime rate by tow…

玩转ChatGPT:Excel操作初探

一、写在前面 首先还是让小Chat推销下自己&#xff1a; Excel 表格制作是个技术活&#xff0c;你掌握了吗&#xff1f;没关系&#xff0c;现在有了 ChatGPT&#xff0c;让 Excel 辅助操作变得更简单&#xff01;再也不用苦恼于数据分析和整理了&#xff0c;让 ChatGPT 成为你…

C语言:简单的扫雷游戏

扫雷游戏想必大家都玩过&#xff0c;像一些大佬呀&#xff0c;十几秒能通关&#xff0c;给大佬点赞&#xff0c;那咱们也设计一个扫雷游戏&#xff0c;具体怎么实现呢&#xff0c;跟上我的脚步&#xff0c;看看用C语言怎么实现简单的扫雷游戏。 一&#xff1a;扫雷游戏的框架 二…

【Linux】冯诺依曼体系结构以及操作系统的初步认知

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、冯诺依曼体系结构二、操…

HTB靶机010-SolidState-WP

#oscp SolidState.md 靶机IP 10.10.10.51 scan Nmap : ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 -F 10.10.10.51 Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-10 13:14 CST Nmap scan report for 10.10.10.51 Host is up (0.77s latency). Not shown: …

如果你还不知道SAGA,那这篇不容错过!|分布式事务系列(五)

这是分布式事务系列的第五篇&#xff0c;如果之前文章没读请自行前往。精华专题&#xff0c;强烈建议收藏。 ‍本文详细讲解了分布式事务解决方案——SAGA。 点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达 SAGA事务 什么是SAGA事务 SAGA…

使用maven引入第三方jar包以及打包

我们知道&#xff0c;Maven 是通过仓库对依赖进行管理的&#xff0c;当 Maven 项目需要某个依赖时&#xff0c;只要其 POM 中声明了依赖的坐标信息&#xff0c;Maven 就会自动从仓库中去下载该构件使用。但在实际的开发过程中&#xff0c;经常会遇到一种情况&#xff1a;对接第…

《基于智能手机PPG信号处理和机器学习的非侵入式血糖监测系统》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…