关于SpringBoot整合Websocket实现简易对话聊天窗

在这里插入图片描述

前言

官网链接:Websocket
Websocket 是什么?它可以将两个独立的浏览器窗口作为通信的两端。 这种形式的通信与传统的 HTTP、TCP 所不同。传统的 HTTP 请求—响应协议是无法实现实时通信的,也就是说,只能由客户端向服务端发送请求,服务端做出响应,再将响应返回给客户端。因此在 Web 开发中,如果需要实时更新消息,只能通过不断刷新页面或者轮询的方式实现,这样会导致大量的用户请求,极大的浪费服务器资源,同时也会增加网络负荷。
在这里插入图片描述

准备工作

  • vue
  • springboot
  • IntelliJ IDEA

后端实现

1.创建SpringBoot项目

使用 IntelliJ IDEA 创建一个 SpringBoot 项目,修改 pom.xml 文件,加入 WebSocket 依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

创建一个 WebSocketConfig 类并且与 @Configuration 注解一起使用。通过 WebSocketHandlerRegistry 对象的 addHandler() 方法注册一个处理器 ChatHandlersetAllowedOrigins("*") 允许任何域名访问。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatHandler(), "/chat").setAllowedOrigins("*");
    }
}

2.创建Websocket处理器

对于每个 WebSocket 连接,都会创建一个实例来处理协议。可以使用 @Component 注解简单的将处理器注册为 Spring 的 Bean,然后在 WebSocket 配置中通过 new ChatHandler() 方式注入。
我们在 ChatHandler 里面监听网络事件,当客户端向唯一的WebSocket端点发送消息时,通过Session.sendMessage(TextMessage message)发送消息,在服务器端接收消息时,使用 TextMessage.getPayload() 方法获取消息体内容,使用Session.getBasicRemote().sendText() 将消息发送到客户端。

@Component
public class ChatHandler extends TextWebSocketHandler {
    private static final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

    //连接成功调用
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        sessions.put(session.getId(), session);
    }

    //接收消息处理消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message)
            throws Exception {
        for (WebSocketSession s : sessions.values()) {
            s.sendMessage(new TextMessage("用户 : "+message.getPayload()));
        }
    }

    //连接关闭调用
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        sessions.remove(session.getId());
    }
}

前端实现

1.初始化 vue 项目

在 vue 项目中,我们装 vue-websocket 包并且 import

import VueWebSocket from 'vue-websocket'
Vue.use(VueWebSocket, 'ws://localhost:8080/chat', {
  reconnection: true,
  reconnectionAttempts: 5
})

2.实现页面代码

接下来,我们创建一个简单的聊天聊天窗口,包含输入框,发送按钮以及一个消息列表。在用户键入消息后,可以通过 .send() 方法将消息发送到Springboot服务器端。

<template>
    <div class="chat-container">
        <div class="chat-msgs">
            <div v-for="msg in msgs" :key="msg.id" class="chat-msg">
                <span>{{ msg.user }}</span>
                <span>{{ msg.message }}</span>
            </div>
        </div>
        <div class="chat-input">
            <input v-model="message" type="text" placeholder="输入你的消息" />
            <button @click="sendMsg">发送</button>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            message: '',
            msgs: []
        }
    },
    methods: {
        sendMsg() {
            this.$socket.send(this.message)
            this.msgs.push({
                id: this.msgs.length,
                user: '我',
                message: this.message
            })
            this.message = ''
        }
    },
    sockets: {
        message(data) {
            this.msgs.push({
                id: this.msgs.length,
                user: '服务端',
                message: data
            })
        }
    }
}
</script>

<style>
.chat-container {
    display: flex;
    flex-direction: column;
    height: 100%;
}

.chat-msgs {
    flex: 1;
    overflow-y: auto;
    margin-bottom: 10px;
}

.chat-msg {
    background-color: #F6F6F6;
    padding: 5px;
    border-radius: 10px;
    margin: 5px;
}

.chat-input {
    display: flex;
    justify-content: center;
}

.chat-input input {
    flex: 1;
    margin-right: 10px;
    padding: 5px;
}

.chat-input button {
    padding: 5px 15px;
    border: none;
    background-color: #4169E1;
    color: #fff;
    border-radius: 5px;
    cursor: pointer;
}
</style>

启动应用程序

启动 SpringBoot 应用程序,然后通过 npm run serve 启动客户端应用程序。打开两个标签页,在页面中输入消息并发送,可以看到两个窗口中的消息相互更新,实现了简单的实时通信。

总结

通过本次实战,我们学习了如何在 SpringBoot 应用程序中使用 WebSocket 实现简单的实时通信,同时将 vue 与 WebSocket 搭配使用,从而完成一个实时聊天窗口。

实时通讯在现代化 Web 应用程序中越来越重要,WebSocket 技术已经成为了主流解决方案。相信通过本文的学习,您已经对 WebSocket 有所了解,并能够将其应用到 Web 开发中。

有需要的小伙伴可以私信我功能模块的代码哦 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot一个用于快速构建基于Spring框架的Java应用程序的开源框架。它简化了Spring应用程序的开发过程,并提供了许多内置的功能和插件,使得开发人员可以更加专注于业务逻辑的实现WebSocket是一种在Web浏览器和Web服务器之间建立持久连接的通信协议,能够实现实时双向通信。 要实现聊天软件的功能,可以使用Spring Boot来快速搭建项目结构和配置。首先,需要在pom.xml文件中添加WebSocket的依赖,例如使用SpringSpring WebSocket库: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 然后,需要创建一个WebSocket配置类来配置WebSocket的相关信息,例如定义访问WebSocket的端点、配置消息传输方式等。可以继承Spring提供的AbstractWebSocketMessageBrokerConfigurer类,并重写相关方法: ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } } ``` 在上述配置类中,使用"/chat"作为WebSocket的端点,并启用了基于内存的消息代理(SimpleBroker),其中"/topic"为消息主题的前缀,"/app"为应用程序请求的前缀。 接下来,可以创建一个WebSocket处理器类来处理WebSocket的连接、关闭和消息等事件。可以实现SpringWebSocketHandler接口,并重写相关方法: ```java @Component public class ChatHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new ArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } } ``` 上述处理器类中,使用一个静态List来保存所有连接的WebSocketSession,以便将消息发送给所有已连接的客户端。 最后,在需要使用WebSocket的控制器或服务中,可以使用@Autowired注解将ChatHandler注入,并使用它来发送消息。 总结来说,通过以上的步骤,我们可以使用Spring Boot整合WebSocket实现聊天软件的功能。当有新的WebSocket连接建立时,我们将其保存在一个静态List中,并在收到消息时将消息发送给所有的连接。通过Spring Boot的简化开发流程和WebSocket的实时双向通信特性,实现一个简单的聊天软件。 ### 回答2: Spring Boot一个用于开发Java应用程序的框架,它能够帮助开发人员更快速、更简洁地构建应用程序。WebSocket是HTML5新增的一种协议,它能够在客户端与服务器之间建立持久的双向通信连接,实时地传输数据。 要实现聊天软件的功能,首先需要导入Spring BootWebSocket的相关依赖。在pom.xml文件中添加Spring BootWebSocket的依赖项。 在Spring Boot的主类中,使用@EnableWebSocket注解启用WebSocket的支持。编写一个WebSocket处理器类,继承自TextWebSocketHandler,并重写其中的方法。在onTextMessage方法中处理接收到的文本消息,在sendMessage方法中处理发送消息。 配置WebSocket的映射路径和处理器,使用@Configuration注解和实现WebSocketConfigurer接口。重写registerWebSocketHandlers方法,设置WebSocket的映射路径和处理器。 在前端界面中,使用JavaScript代码连接WebSocket服务器,并处理接收消息和发送消息的逻辑。通过WebSocket对象的onmessage方法处理接收到的消息,并将消息显示在聊天界面上。通过WebSocket对象的send方法发送消息给服务器。 通过以上步骤,就可以实现Spring BootWebSocket整合,从而实现聊天软件的功能。开发人员可以根据具体的需求,进一步完善聊天软件的功能,例如用户名的验证、消息的存储和管理等。 总结起来,使用Spring BootWebSocket可以快速、简洁地实现聊天软件。借助Spring Boot的开发效率和WebSocket的实时通信功能,开发人员能够轻松地构建出高效、稳定的聊天软件。 ### 回答3: Spring Boot一个基于 Spring 框架的开源服务端开发框架,提供了快速开发和方便部署的特性。WebSocket 是一种基于TCP协议的双向通信协议,通过浏览器与服务器建立持久连接,实现实时通信。 使用 Spring Boot 整合 WebSocket 实现聊天软件的步骤如下: 1. 创建一个 Spring Boot 项目,引入 WebSocket 依赖包。 2. 在配置类上添加 `@EnableWebSocket` 注解以启用 WebSocket 功能。 3. 创建一个 WebSocket 处理器类,继承自 `TextWebSocketHandler`,覆写其中的方法,如 `handleTextMessage()` 和 `afterConnectionEstablished()`。 4. 在 `handleTextMessage()` 方法中,获取客户端发送的消息,处理后将消息发送给所有连接到服务器的客户端。 5. 在 `afterConnectionEstablished()` 方法中,可以处理客户端连接成功后的逻辑。 6. 创建一个控制器类,处理客户端与服务器的交互,如发送消息、接收消息等。 7. 在控制器类中,使用 `@Autowired` 注入 WebSocket 处理器类的对象,并通过该对象发送消息给客户端。 8. 在前端页面中使用 JavaScript 创建 WebSocket 连接,并实现相应的回调函数,实现与服务器的实时通信。 通过以上步骤,可以实现一个简单的聊天软件。用户在页面上发送消息,消息通过 WebSocket 连接发送到服务器,服务器将消息广播给所有客户端,实现实时聊天的功能。 总之,借助 Spring Boot 提供的便利性和 WebSocket 协议的实时通信特性,可以快速实现一个聊天软件。不仅可以在浏览器上实现聊天功能,还可以通过移动端等其他客户端实现跨平台的聊天应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙漠真有鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值