前言
最近项目中需要让信息主动推送到前端,所有就使用到了WebSocket
第一步 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
第二步 创建WebSocket配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration //声明为配置类,并交给spring管理
@EnableWebSocket //开启WebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//如果不是注解形式使用WebSocket,需要在该处进行声明,否则为空即可
//WebSocketDemo实现了WebSocketHandler接口
//registry.addHandler(new WebSocketDemo(), "/webSocket");
}
第三步 创建WebSocket服务类
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
//设置访问的路径,还有其他功能,自行测试
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocketService {
private Session session;
//存放已经连接的websocket对象,
private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSockets.add(this);
log.debug("有新的连接,总数{}", webSockets.size());
}
@OnClose
public void onClose() {
webSockets.remove(this);
log.debug("有新的断开,总数{}", webSockets.size());
}
@OnMessage
//注意发送消息时只能是String类型,其他类型会有个错误类型的错误
public void onMessage(String message) {
send(message);
}
public void send(String message) {
for (WebSocket webSocket : webSockets) {
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("发送失败", e);
}
}
}
websocket 注解说明:
@ServerEndpoint : websocket 服务端站点注解,用于Java类,类似于 @Controller, 使用该注解的类,即可接收客户端发来的 socket 信息
@OnOpen: 该注解用于方法上,打开 socket 连接时触发
@OnMessage: 该注解用于方法上,在客户端发送消息时触发
@OnClose: 该注解用于方法上,当关闭 socket 连接时触发
@OnError: 该注解用于方法上,当 socket 连接出现异常时触发,触发异常,会导致 socket 连接断开。通常发送的消息不合法、格式错误会导致异常抛出。
这样一个简单的demo就完成了,最后只需要启动springboot,进行访问就行了。
访问地址:
ws://127.0.0.1:8082/之前设置的访问路径