springboot项目,使用websocket持续给前端(vue)发送数据。但是会经常中断,不发数据了,记录在线人数的功能正常,如果有新的登录或者登出,后台正常显示。就是不发数据了,需要重启项目才会发数据。
package com.smart.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @Description: websocket工具类,
* flag表示身份标识:
* bigScreen:大屏
* backSys:后台系统
*/
@ServerEndpoint("/websocket/{flag}")
@Component
public class WebSocketUtils {
private Logger logger = LoggerFactory.getLogger(getClass());
public static final String BIGSCREEN = "bigScreen"; //大屏
public static final String BACKSYS = "backSys"; //后台
//静态变量,用来记录当前在线连接数
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<WebSocketUtils> webSocketSet = new CopyOnWriteArraySet<>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
/**
* 身份标识
*/
private String flag;
/**
* 连接建立成功调用的方法
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(@PathParam("flag") String flag, Session session){
this.session = session;
this.flag = flag;
webSocketSet.add(this);
addOnlineCount(); //在线数加1
logger.info("有新连接加入!当前在线人数为" + getOnlineCount()+",上线用户为:"+this.flag);
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(){
webSocketSet.remove(this);
subOnlineCount(); //在线数减1
logger.info("有一连接关闭!当前在线人数为" + getOnlineCount()+",下线用户为:"+this.flag);
}
/**
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息
* @param session 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
//解析message
if(message==null){
session.getAsyncRemote().sendText("发送的消息不能为空");
}else{
}
}
/**
* 发生错误时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
logger.info("发生错误:"+error.getMessage());
error.printStackTrace();
}
/**
* 群发消息
* @param message
* @throws IOException
*/
public void sendMessageToFlag(String message){
for (WebSocketUtils ws : webSocketSet){
try{
ws.sendMessage(message);
}catch (Exception e){
logger.error("sendMessageToFlag: "+e.toString());
}
}
}
/**
* 给指定身份发送消息
* @param message
* @param flag
* @throws IOException
*/
public void sendMessageToFlag(String message,String flag){
try{
boolean online = true;
for (WebSocketUtils ws : webSocketSet){
if (flag.equals(ws.flag)){
ws.sendMessage(message);
online = false;
}
}
if (online){
logger.info(flag+"不在线");
}
}catch (Exception e){
logger.error("sendMessageToFlag: "+e.toString());
}
}
public boolean isonline(){
boolean online = false;
for (WebSocketUtils ws : webSocketSet){
if (BIGSCREEN.equals(ws.flag)){
online = true;
}
}
return online;
}
public void sendMessageToBigScreen(String message){
sendMessageToFlag(message,BIGSCREEN);
}
public void snedMessage2BackSys(String message){
sendMessageToFlag(message,BACKSYS);
}
/**
* 服务器主动推送消息到客户端
* @param message
* @throws IOException
*/
private void sendMessage(String message) throws IOException {
synchronized(this.session){
this.session.getBasicRemote().sendText(message);
}
System.out.println("发送数据给:"+this.flag+":"+message);
}
private static synchronized int getOnlineCount() {
return onlineCount;
}
private static synchronized void addOnlineCount() {
WebSocketUtils.onlineCount++;
}
private static synchronized void subOnlineCount() {
WebSocketUtils.onlineCount--;
}
}