目录
- 一、概述
- 二、Websocket API
- 1、引入相关依赖
- 2、配置WebSocket处理器
- 3、WebSocket配置
- 4、测试
- 三、总结
一、概述
在上一节 WebSocket的那些事(1-概念篇)中我们简单的介绍了关于WebSocket协议的相关概念、与HTTP的联系区别等等。
这一节将会带来WebSocket的实操环节,主要包括Spring本身提供的WebSocket API以及对STOMP协议的支持。
二、Websocket API
1、引入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、配置WebSocket处理器
这里我们创建了简单的EchoWebsocketHandler ,会原封不动返回来自客户端的消息。
@Slf4j
public class EchoWebsocketHandler extends TextWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String content = new String(message.asBytes(), StandardCharsets.UTF_8);
log.info("WebSocket message received: {}", content);
session.sendMessage(message);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("Connection established, request uri:{}", session.getUri());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info("Connection closed, request uri:{}", session.getUri());
}
}
3、WebSocket配置
@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// HttpSessionHandshakeInterceptor可以将HttpSession中的属性转换为WebsocketSession的属性
registry.addHandler(new EchoWebsocketHandler(), "/echo")
.addInterceptors(new HttpSessionHandshakeInterceptor());
}
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
// 指定单次最大可传输的文本消息大小为4 * 1024字符
container.setMaxTextMessageBufferSize(4 * 1024);
// 指定单次最大可传输的二进制消息大小为8 * 1024字节
container.setMaxBinaryMessageBufferSize(8 * 1024);
return container;
}
}
4、测试
直接启动项目,打开Postman,输入 ws://localhost:8080/echo
,如下:
点击连接后,显示连接成功,直接发送消息即可。可以看到,客户端发什么,服务端就响应什么。
三、总结
使用原生Websocket会有一些缺点,我们总结一下:
- 兼容性问题:Websocket是HTML5标准中新增的技术,并不是所有浏览器都支持该技术。
- 连接维持问题:WebSocket连接是一直保持开放状态的,因此会占用一定的带宽和资源。如果连接数量过多或者连接持续时间过长,可能会对服务器造成一定的压力。
- 安全问题:WebSocket连接的开放性可能会引起一些安全问题,例如未经授权的用户访问WebSocket服务、数据被劫持等。
- 服务端实现问题:由于消息内容并没有传输标准,无法对消息进行路由和处理。
下篇文章我们将会结合SockJS
和STOMP
来实现WebSocket
消息传输。