Spring Boot 开发实时聊天室:从零到上线,手把手教学!
创作时间:
作者:
@小白创作中心
Spring Boot 开发实时聊天室:从零到上线,手把手教学!
引用
CSDN
1.
https://blog.csdn.net/2301_78858041/article/details/145975550
本文将手把手教你使用Spring Boot和Vue.js开发一个功能完善的实时聊天室。从环境准备、WebSocket配置到前端界面实现,每个环节都配有详细的代码示例和步骤说明。
前言:为什么选择 Spring Boot 开发聊天室?
在现代 Web 应用中,实时聊天功能几乎是标配。无论是社交平台、在线客服,还是团队协作工具,实时聊天都能显著提升用户体验。Spring Boot 作为 Java 后端开发的事实标准,搭配 WebSocket 技术,可以轻松实现高效、实时的通信功能。本文将从零开始,手把手教你开发一个功能完善的实时聊天室!
第一部分:功能需求与架构设计
1.1 功能需求
- 实时消息发送与接收
- 显示在线用户列表
- 展示历史聊天记录
- 支持消息撤回与删除(可选)
- 界面友好、操作简单
1.2 架构设计
- 后端:使用 Spring Boot + WebSocket 实现实时通信。
- 前端:使用 Vue.js + WebSocket 客户端库(如 sockjs-client)。
- 数据库:使用 MySQL 存储聊天记录。
第二部分:环境准备
2.1 开发工具
- IDEA 或 VS Code
- JDK 11+
- Maven 3.6+
- MySQL 8.0+
- Node.js (用于前端开发)
2.2 依赖引入
在 pom.xml 中添加以下依赖:
<dependencies>
<!-- Spring Boot 核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- WebSocket 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- MySQL 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- Lombok 简化代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
第三部分:后端开发
3.1 配置 WebSocket
3.1.1 创建 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;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*");
}
}
3.1.2 配置 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("/chat.sendMessage")
@SendTo("/topic/chat")
public ChatMessage sendMessage(ChatMessage message) {
return message;
}
@MessageMapping("/chat.typing")
@SendTo("/topic/typing")
public TypingIndicator typing(TypingIndicator indicator) {
return indicator;
}
}
3.2 实体类设计
3.2.1 聊天消息实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatMessage {
private String sender;
private String content;
private Long timestamp;
}
3.2.2 在线状态实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OnlineStatus {
private String username;
private boolean online;
}
3.3 数据库设计
创建 chat_message 表:
CREATE TABLE chat_message (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
sender VARCHAR(50),
content TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
第四部分:前端开发
4.1 初始化 Vue 项目
vue create chat-room
cd chat-room
npm install
4.2 安装依赖
npm install sockjs-client stompjs
4.3 实现聊天界面
4.3.1 main.js
import Vue from 'vue';
import App from './App.vue';
import SockJS from 'sockjs-client';
import { Stomp } from 'stompjs';
Vue.prototype.$sock = new SockJS('http://localhost:8080/ws');
Vue.prototype.$stomp = Stomp.over(Vue.prototype.$sock);
new Vue({
render: h => h(App),
}).$mount('#app');
4.3.2 Chat.vue
<template>
<div class="chat-container">
<div class="chat-header">
<h2>实时聊天室</h2>
<div class="online-users">
在线用户:{{ onlineUsers }}
</div>
</div>
<div class="chat-messages" ref="messages">
<div v-for="(message, index) in messages" :key="index">
<strong>{{ message.sender }}</strong>: {{ message.content }}
</div>
</div>
<div class="input-container">
<input type="text" v-model="newMessage" @keyup.enter="sendMessage" placeholder="输入消息...">
<button @click="sendMessage">发送</button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
messages: [],
newMessage: '',
onlineUsers: []
};
},
mounted() {
const socket = this.$sock;
const stompClient = this.$stomp;
stompClient.connect({}, frame => {
console.log('Connected:', frame);
stompClient.subscribe('/topic/chat', message => {
this.messages.push(JSON.parse(message.body));
this.$refs.messages.scrollTop = this.$refs.messages.scrollHeight;
});
stompClient.subscribe('/topic/online', message => {
this.onlineUsers = JSON.parse(message.body);
});
});
},
methods: {
sendMessage() {
if (this.newMessage.trim()) {
const message = {
sender: localStorage.getItem('username'),
content: this.newMessage,
timestamp: new Date().getTime()
};
this.$stomp.send('/app/chat.sendMessage', {}, JSON.stringify(message));
this.newMessage = '';
}
}
}
};
</script>
第五部分:功能扩展与优化
5.1 实时在线状态更新
@Component
public class OnlineStatusListener {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@MessageMapping("/connect")
public void handleConnect(String username) {
messagingTemplate.convertAndSend("/topic/online", OnlineStatus.builder()
.username(username)
.online(true)
.build());
}
@MessageMapping("/disconnect")
public void handleDisconnect(String username) {
messagingTemplate.convertAndSend("/topic/online", OnlineStatus.builder()
.username(username)
.online(false)
.build());
}
}
5.2 消息持久化
@Repository
public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long> {}
@Service
public class ChatService {
@Autowired
private ChatMessageRepository repository;
public void saveMessage(ChatMessage message) {
repository.save(message);
}
}
第六部分:总结与展望
通过本文的学习,你已经掌握了如何使用 Spring Boot 和 Vue.js 开发一个实时聊天室的完整流程。从 WebSocket 的配置到前端界面的实现,再到消息的持久化存储,每一个环节都进行了详细的讲解。
未来,你可以在此基础上进行更多扩展,例如:
- 添加群聊功能
- 实现消息撤回与删除
- 支持表情包和图片上传
- 集成语音聊天功能
热门推荐
亚历山大大帝如何终结波斯帝国?
南京鸡鸣寺旅游攻略
物理法、化学法、生物法回收PET及产业化进展
科学应对宝宝吐奶:从原因到解决方案
秋冬季节如何预防宝宝吐奶?这些科学喂养技巧请收好
宝宝吐奶怎么办?这些实用妙招帮你轻松应对
科学搭配辅食,告别宝宝吐奶烦恼
新生儿吐奶背后的真相揭秘!
平底锅也能做出香酥可口的花生酥!
无烤箱也能做!超简单花生酥教程
如何用特比萘芬预防角化型脚气?
冬季公共浴室防脚气小妙招
30个灵感来源:探索创意的无尽宝库
血型O大揭秘:定义、意义及常见误区!
淋巴结节怎么办才能消除
冬天一定要尝下萝卜腊鸭腿饭
2024年养老资格认证攻略:时间、方式及注意事项全解析
高效沟通的经典案例如何促进跨文化交流?
非暴力沟通:职场人必备的高效沟通指南
MBTI的INFP人格全面解析:INFP人格成长指南
MBTI性格分类的理论与实践:探索你的性格类型
上门产康服务:社区产康中心的新宠儿
重吸收之外:破骨细胞是骨骼形成的驱动者
手工鱼丸制作教程
刺身美味:日本原始之美之旅
八字学遇上现代职业规划:从年月日时到职场进阶
塔罗牌职业占卜:找到适合你的幸运职业
故宫展揭示:西汉与波斯的文化碰撞
项目经理如何与刺头沟通
温柔还是粗暴?过来人教你如何处理伴侣间的情绪