最近项目中一个需求,需要从服务器端推送消息到浏览器端,浏览器端接收到消息推送执行弹窗提示。
这里选用了websocket,记录下使用步骤,项目使用的springboot。
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
- 开启websocket
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
- 创建webSocketSever
@ServerEndpoint("/yourServerPath")
@Component("YourServerName")
@Slf4j
public class MotorAlarmWebSocketServer {
// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象
private static final CopyOnWriteArraySet<MotorAlarmWebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
public static Set<MotorAlarmWebSocketServer> getWebSocketSet(){
return webSocketSet;
}
// 与某个客户端的连接会话,需要通过它来与客户端进行数据收发
private Session session;
@OnOpen
public void onOpen(Session session) throws IOException {
this.session = session;
webSocketSet.add(this);
log.info("系统连接成功");
}
@OnClose
public void onClose() {
webSocketSet.remove(this);
}
/**
* 收到客户端消息后调用的方法
*/
@OnMessage
public void onMessage(String message) {
//群发消息
for (MotorAlarmWebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
log.info("消息发送失败");
}
}}
@OnError
public void onError(Session session, Throwable error) {
log.info("断开连接");
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws IOException {
for (MotorAlarmWebSocketServer item : webSocketSet) {
if (item.session.isOpen()) {
item.session.getBasicRemote().sendText(message);
}
}
}
这样当后台启动项目时,webSocket也就同时启动,同时会监听接入的链接,业务逻辑中可以调用该方法的sendMessage方法会向接入的链接发送。