首页 > 其他分享 >实现基于Spring Boot和WebSockets的实时通讯应用

实现基于Spring Boot和WebSockets的实时通讯应用

时间:2024-07-18 14:58:10浏览次数:17  
标签:WebSocket Spring Boot springframework org import config public WebSockets

实现基于Spring Boot和WebSockets的实时通讯应用

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

实时通讯应用在现代互联网服务中越来越重要。使用WebSocket可以实现客户端和服务器之间的双向通讯,从而大大提高实时性。本文将介绍如何使用Spring Boot和WebSockets构建一个简单的实时通讯应用。

项目结构

首先,我们需要搭建一个Spring Boot项目。可以使用Spring Initializr来快速生成项目结构,选择如下依赖:

  • Spring Web
  • Spring WebSocket
  • Spring Boot DevTools

WebSocket配置

创建WebSocket配置类来配置WebSocket端点和消息处理器:

package cn.juwatech.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }
}

这里我们启用了简单的消息代理,并将应用程序目的地前缀设置为/app。WebSocket端点注册为/ws,并启用了SockJS以便在WebSocket不可用时回退到其他通信方式。

消息处理器

创建一个控制器来处理WebSocket消息:

package cn.juwatech.websocket;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class ChatController {

    @MessageMapping("/message")
    @SendTo("/topic/messages")
    public ChatMessage sendMessage(ChatMessage message) {
        return message;
    }
}

在这个控制器中,我们定义了一个处理方法sendMessage,该方法接受来自/app/message目的地的消息,并将响应发送到/topic/messages目的地。

消息类

定义一个消息类来表示聊天消息:

package cn.juwatech.websocket;

public class ChatMessage {
    private String from;
    private String text;

    public ChatMessage() {
    }

    public ChatMessage(String from, String text) {
        this.from = from;
        this.text = text;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

前端页面

创建一个简单的HTML页面来测试我们的WebSocket实时通讯:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat</title>
    <script src="https://cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/stompjs/lib/stomp.min.js"></script>
    <script>
        var stompClient = null;

        function connect() {
            var socket = new SockJS('/ws');
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function (frame) {
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/messages', function (messageOutput) {
                    showMessage(JSON.parse(messageOutput.body));
                });
            });
        }

        function sendMessage() {
            var from = document.getElementById('from').value;
            var text = document.getElementById('text').value;
            stompClient.send("/app/message", {}, JSON.stringify({'from': from, 'text': text}));
        }

        function showMessage(message) {
            var response = document.getElementById('response');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message.from + ": " + message.text));
            response.appendChild(p);
        }

        window.onload = function() {
            connect();
        };
    </script>
</head>
<body>
    <div>
        <input type="text" id="from" placeholder="Your name" />
        <input type="text" id="text" placeholder="Say something" />
        <button onclick="sendMessage()">Send</button>
        <div id="response"></div>
    </div>
</body>
</html>

这个页面包含一个简单的表单,用于输入消息和发送消息。通过SockJS和STOMP进行WebSocket连接,并处理消息的发送和接收。

运行应用

确保你的Spring Boot应用程序已经启动,打开浏览器访问index.html页面。输入用户名和消息内容,点击发送按钮即可看到实时的消息通讯效果。

扩展功能

在实际应用中,可能还需要实现更多功能,如用户身份验证、消息持久化、群聊和私聊等。可以通过以下方式扩展:

  • 身份验证:使用Spring Security进行用户身份验证和授权。
  • 消息持久化:将消息存储到数据库,如MySQL或MongoDB。
  • 群聊和私聊:扩展WebSocket配置和消息处理器,实现不同的聊天模式。

以下是一个扩展的示例,展示如何在WebSocket消息中添加用户身份验证:

package cn.juwatech.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketSecurityConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new AuthChannelInterceptorAdapter());
    }
}

这个配置类中,我们添加了一个自定义的消息通道拦截器,用于处理消息中的身份验证逻辑。

通过本文的介绍,我们实现了一个基于Spring Boot和WebSockets的实时通讯应用,包括WebSocket配置、消息处理器、消息类、前端页面和扩展功能等方面。这些技术和方法可以帮助我们构建高效、可靠的实时通讯应用。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:WebSocket,Spring,Boot,springframework,org,import,config,public,WebSockets
From: https://www.cnblogs.com/szk123456/p/18309534

相关文章

  • springboot博客交流平台-计算机毕业设计源码56406
    摘要博客交流平台作为一种重要的网络平台,为用户提供了展示自我、分享经验和与他人互动的空间。在国内外,研究者们关注博客交流平台的各个方面,并取得了显著的进展。研究内容主要包括用户体验和界面设计、社交化和互动性、多媒体内容支持、移动设备适配和跨平台体验、数据分析......
  • springboot访问多个mysql数据库配置多数据源
    一、参考地址:https://github.com/baomidou/dynamic-datasource二、使用方法引入dynamic-datasource-spring-boot-starter或者dynamic-datasource-spring-boot3-starter。spring-boot1.5.x2.x.x点击查看代码<dependency><groupId>com.baomidou</groupId><art......
  • SpringBoot整合MyBatis+MySQL
    一、添加mysql驱动mysqlmysql-connector-java二、添加MyBatis依赖org.mybatis.spring.bootmybatis-spring-boot-starter3.0.1三、添加配置spring:datasource:name:xx-datasourcedriverClassName:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/xx-......
  • SpringSecurity基础学习-功能完善
    注册在数据库中手动维护用户信息是不合理的,同时数据库中存储明文密码也很容易出问题,因此注册接口是一个必须的接口代码实现Loginpackagecom.learn.security.domain.entity;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotat......
  • SpringCloud项目的搭建
    一、相关依赖导入1.注册中心<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><version>4.1.0</version>......
  • 深入解析微服务架构之Spring Cloud
    目录微服务架构简介什么是微服务微服务的优势微服务的挑战SpringCloud概述SpringCloud简介SpringCloud的主要特性SpringCloud的模块划分SpringCloud核心组件详解SpringCloudNetflixSpringCloudConfigSpringCloudGatewaySpringCloudSleuthSpringCloudBu......
  • SpringBoot 跨域请求处理全攻略:从原理到实践
    文章目录SpringBoot如何处理跨域请求?你能说出几种方法?跨域请求概述跨域解决方案1.使用@CrossOrigin注解2.使用WebMvcConfigurer配置类3.使用过滤器(Filter)4.使用SpringSecurity处理CORS5.使用SpringCloudGateway处理CORS补充1.预检请求(PreflightRequests)2.其......
  • Spring中Map类型依赖注入的使用
    为了详细解释这段代码的装配过程,并编写一份详细的开发文档,我们需要从几个方面进行阐述:Spring框架的依赖注入机制、@Resource注解的作用、Map<String,ProcessListener>类型作为依赖的特别性,以及这段代码在实际开发中的应用和注意事项。1.Spring框架的依赖注入机制Spring框架的......
  • Spring与设计模式实战之策略模式
    Spring与设计模式实战之策略模式引言在现代软件开发中,设计模式是解决常见设计问题的有效工具。它们提供了经过验证的解决方案,帮助开发人员构建灵活、可扩展和可维护的系统。本文将探讨策略模式在Spring框架中的应用,并通过实际例子展示如何通过Spring的特性来实现和管理策......
  • 深入浅出Spring Web MVC:从零开始构建你的第一个Web应用
    深入浅出SpringWebMVC:从零开始构建你的第一个Web应用大家好,今天我们来聊聊SpringWebMVC,这是一个非常强大的框架,用于构建JavaWeb应用。我们将从零开始,逐步构建一个简单的Web应用,帮助大家理解SpringWebMVC的核心概念和使用方法。什么是SpringWebMVC?SpringWebMVC是Spri......