SpringBoot中websocket的使用
最近看到websocket相关内容, 记录一下SpringBoot和websocket的简单使用
1 WebSocket诞生
经典的问题: 有了HTTP协议, 为什么还需要WebSocket协议.
因为HTTP协议需要客户端向服务端发起请求, 服务端才能响应数据, 服务端不能主动向客户端通信. 在一些场景下, 需要服务端向客户端发起通信, 推送数据, 所以WebSocket协议诞生了.
2 WebSocket的简介
WebSocket 协议在2008年诞生,2011年成为国际标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
其主要的特点是: 允许服务器主动发送信息给客户端.
使用场景:
- 聊天室
- 消息推送
3 WebSocket的使用
1 准备一个SpringBoot环境
2 添加WebSocket配置
@Configuration
public class websocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3 添加服务端WebSocket类
@Component
@Slf4j
@ServerEndpoint(value = "/test/{userId}")
public class SocketTest {
private String userId;
// 连接时执行
@OnOpen
public void onOpen(@PathParam("userId") String userId, Session session) throws IOException {
this.userId = userId;
log.info("新连接:{}", userId);
}
// 关闭时执行
@OnClose
public void onClose() {
log.info("连接:{} 关闭", this.userId);
}
// 收到消息时执行
@OnMessage
public void onMessage(String message, Session session) throws IOException {
log.info("收到用户{}的消息{}", this.userId, message);
session.getBasicRemote().sendText("收到 " + this.userId + " 的消息 "); //回复用户
}
// 连接错误时执行
@OnError
public void onError(Session session, Throwable error) {
log.info("用户userId为:{}的连接发送错误", this.userId);
error.printStackTrace();
}
}
4 启动项目, 使用在线工具模仿前端调用WebSocket
在线工具: http://coolaf.com/tool/chattest
5 查看数据
以本地为例:
访问: ws://localhost:8080/test/user001
// 输入地址,点击连接,看到控制台 输出新建连接
// 发送哈哈到后台, 看到控制台 收到用户的哈哈
// 断开连接, 看到控制台,断开连接
// 新连接:user001
// 收到用户user001的消息哈哈
// 连接:user001 关闭
参考资料:
https://www.ruanyifeng.com/blog/2017/05/websocket.html