WebSocket+SpringBoot,从零实现实时聊天功能!

 一、WebSocket是什么?为什么它适合做聊天?

WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。不同于HTTP的请求-响应模式,WebSocket建立连接后,服务器可以主动向客户端推送数据,这才是真正的"实时"通信。

传统轮询方案HTTP需要不断请求询问服务器是否有新消息,不仅延迟高(1-3秒),还浪费带宽。而WebSocket一旦建立连接,服务器有新消息就能立即推送给客户端,真正实现实时通信。

 二、SpringBoot中集成WebSocket

 1. 添加依赖

首先在pom.xml中添加WebSocket支持:

```xml

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-websocket</artifactId>

</dependency>

```

 2. 配置WebSocket

创建配置类启用WebSocket:

```java

@Configuration

@EnableWebSocket

public class WebSocketConfig implements WebSocketConfigurer {

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

registry.addHandler(myHandler(), "/chat")

.setAllowedOrigins("*");

}

@Bean

public WebSocketHandler myHandler() {

return new MyWebSocketHandler();

}

}

```

 三、核心WebSocket处理器实现

创建消息处理类:

```java

public class MyWebSocketHandler extends TextWebSocketHandler {

// 保存所有活跃的会话

private static final Set<WebSocketSession> sessions = new CopyOnWriteArraySet<>();

@Override

public void afterConnectionEstablished(WebSocketSession session) {

sessions.add(session);

System.out.println("新连接建立:" + session.getId());

}

@Override

protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

// 广播所有消息给其他客户端

for(WebSocketSession s : sessions) {

if(s.isOpen() && !s.getId().equals(session.getId())) {

s.sendMessage(message);

}

}

}

@Override

public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {

sessions.remove(session);

System.out.println("连接关闭:" + session.getId());

}

}

```

 四、前端HTML+JS实现

简单的前端实现:

```html

<!DOCTYPE html>

<html>

<head>

<title>WebSocket聊天</title>

<script>

let socket;

function connect() {

// 替换为你的服务器地址

socket = new WebSocket('ws://localhost:8080/chat');

socket.onopen = function(e) {

log('连接已建立');

};

socket.onmessage = function(e) {

log('收到消息: ' + e.data);

};

socket.onclose = function(e) {

log('连接已关闭');

};

}

function sendMessage() {

const message = document.getElementById('message').value;

socket.send(message);

log('发送消息: ' + message);

document.getElementById('message').value = '';

}

function log(text) {

const log = document.getElementById('log');

log.innerHTML += text + '<br/>';

}

</script>

</head>

<body onload="connect()">

<h2>WebSocket聊天</h2>

<div id="log" style="height:300px; overflow-y:scroll;"></div>

<input type="text" id="message" placeholder="输入消息...">

<button onclick="sendMessage()">发送</button>

</body>

</html>

```

 五、项目扩展思路

1. **消息持久化**:将聊天消息保存到数据库,实现历史记录查询

2. **私聊功能**:为每个用户分配唯一ID,指定消息发送给特定用户

3. **用户列表**:维护在线用户列表,实时更新前端显示

4. **鉴权认证**:连接WebSocket时进行身份验证,防止匿名访问

5. **性能优化**:考虑使用Redis发布订阅功能替代本地session管理

 六、总结

WebSocket与SpringBoot结合可以轻松实现高性能的实时通信功能。本文从基础实现出发,介绍了核心配置和代码实现。虽然只是一个简单示例,但已经包含了WebSocket的核心要素,包括连接建立、消息处理和断开连接的处理。

在实际项目中,还需要考虑更多因素如流量控制、消息压缩、断线重连等,但基础的通信模式是不变的。掌握了这些核心概念后,你可以基于此构建更复杂的实时通信应用!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐