一、导入依赖包:
<!-- 要继承起步依赖spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<dependencies>
<!-- 导入websocket依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
二、使用WebSocket建立服务端(简单的示例):
1.创建WebSocket自动加载的配置类(启动时会自动加载):
@Configuration
@EnableWebSocket//WebSocket配置类
public class WSConfig implements WebSocketConfigurer {
@Autowired
private WSInterceptor wSInterceptor; //自定义拦截器
@Bean
public WebSocketHandler msgHandler() {
return new WSMsgHandler();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(msgHandler(), "/ws") //设置自定义消息处理
.setAllowedOrigins("*").addInterceptors(wSInterceptor); //设置自定义拦截器
}
}
2.WebSocket消息处理类:
//WebSocket消息处理类
public class WSMsgHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {//收到消息触发
//处理接收到的消息
String body = message.getPayload();
session.sendMessage(new TextMessage("消息回执")); //发送回执消息
}
@Override
public void afterConnectionEstablished(WebSocketSession wsSession) throws Exception {//建立连接触发
wsSession.sendMessage(new TextMessage("建立连接"));
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {//断开连接触发
}
}
3.WebSocket消息拦截类:
@Component //WebSocket消息拦截类
public class WSInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> map) throws Exception {
return true; //返回false不会立连接
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {//建立连接后触发
}
}
三、WebSocket整合RocketMQ:
说明:将离线消息保存在RocketMQ服务器,当用户上线时,自动推送给用户。
RocketMQ安装/使用:https://blog.csdn.net/a526001650a/article/details/107978792
@Component
@RocketMQMessageListener(consumerGroup = "my_group", //组名称
topic = "my_topic", //订阅名称
messageModel = MessageModel.BROADCASTING,
selectorExpression = "SEND_MSG") //接收发送的消息
public class WSRMQMsgReceive extends TextWebSocketHandler implements RocketMQListener<String> {
@Autowired
private RocketMQTemplate rocketMQTemplate;
private final Map<Long, WebSocketSession> wSList = new HashMap<>(); // 连接列表
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception { //连接建立时触发
Long userNo = (Long) session.getAttributes().get("uid"); //得到当前连接
wSList.put(userNo, session); //保存连接列表
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception { //收到WebSocket的消息
Long uid = (Long) session.getAttributes().get("uid");
//处理接收到的消息
String body = textMessage.getPayload();
//1.解析body得到接收者ID
Long tarUserNo = 0L;
//2.取出此用户的连接通道
WebSocketSession tarSession = wSList.get(tarUserNo);
if (tarSession != null && tarSession.isOpen()) { //此用户在线
tarSession.sendMessage(new TextMessage("消息内容")); //将消息转发给此用户
return;
}
//此用户不在线时,将消息发送到RocketMQ服务器存着,当此用户上线时自动接收
Message mqMessage = MessageBuilder.withPayload(body).build();
rocketMQTemplate.send("my_topic", mqMessage);
}
@Override
public void onMessage(String msg) {//收到RocketMQ服务器推过来的消息
try {
//处理接收到的消息
String body = msg;
//1.解析body得到接收者ID
Long toUserNo = 0L;
WebSocketSession tarSession = wSList.get(toUserNo);
if (tarSession != null && tarSession.isOpen()) {//此用户在线时,将消息通过WS发过去
tarSession.sendMessage(new TextMessage(msg));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}