|
|
package com.glxp.api.config;
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.glxp.api.entity.system.WebSocketEntity;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.websocket.*;
|
|
|
import javax.websocket.server.PathParam;
|
|
|
import javax.websocket.server.ServerEndpoint;
|
|
|
import java.io.IOException;
|
|
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
|
|
|
@Component
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
@ServerEndpoint("/api/websocket/{sid}")
|
|
|
public class WebSocketServer {
|
|
|
private static int onlineCount = 0;
|
|
|
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
|
|
|
private Session session;
|
|
|
private String sid = "";
|
|
|
|
|
|
/**
|
|
|
* 连接建立成功调用的方法
|
|
|
*/
|
|
|
@OnOpen
|
|
|
public void onOpen(Session session, @PathParam("sid") String sid) {
|
|
|
this.session = session;
|
|
|
webSocketSet.add(this); //加入set中
|
|
|
this.sid = sid;
|
|
|
addOnlineCount(); //在线数加1
|
|
|
try {
|
|
|
sendMessage(new WebSocketEntity("sys", "连接成功"));
|
|
|
log.info("有新窗口开始监听:" + sid + ",当前在线人数为:" + getOnlineCount());
|
|
|
} catch (IOException e) {
|
|
|
log.error("websocket IO Exception");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 连接关闭调用的方法
|
|
|
*/
|
|
|
@OnClose
|
|
|
public void onClose() {
|
|
|
webSocketSet.remove(this); //从set中删除
|
|
|
subOnlineCount(); //在线数减1
|
|
|
//断开连接情况下,更新主板占用情况为释放
|
|
|
log.info("释放的sid为:" + sid);
|
|
|
//这里写你 释放的时候,要处理的业务
|
|
|
log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 收到客户端消息后调用的方法
|
|
|
*
|
|
|
* @ Param message 客户端发送过来的消息
|
|
|
*/
|
|
|
@OnMessage
|
|
|
public void onMessage(String message, Session session) {
|
|
|
log.info("收到来自窗口" + sid + "的信息:" + message);
|
|
|
//群发消息
|
|
|
for (WebSocketServer item : webSocketSet) {
|
|
|
try {
|
|
|
item.sendMessage(new WebSocketEntity("back", message));
|
|
|
} catch (IOException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @ Param session
|
|
|
* @ Param error
|
|
|
*/
|
|
|
@OnError
|
|
|
public void onError(Session session, Throwable error) {
|
|
|
log.error("发生错误");
|
|
|
error.printStackTrace();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 实现服务器主动推送
|
|
|
*/
|
|
|
public void sendMessage(WebSocketEntity webSocketEntity) throws IOException {
|
|
|
String message = JSON.toJSON(webSocketEntity).toString();
|
|
|
this.session.getBasicRemote().sendText(message);
|
|
|
}
|
|
|
|
|
|
public static void sendInfo(String message, String type) {
|
|
|
log.info("推送消息到窗口" + type + ",推送内容:" + message);
|
|
|
|
|
|
for (WebSocketServer item : webSocketSet) {
|
|
|
try {
|
|
|
if (type == null) {
|
|
|
item.sendMessage(new WebSocketEntity("sid", message));
|
|
|
} else {
|
|
|
item.sendMessage(new WebSocketEntity(type, message));
|
|
|
}
|
|
|
} catch (IOException e) {
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
public static synchronized int getOnlineCount() {
|
|
|
return onlineCount;
|
|
|
}
|
|
|
|
|
|
public static synchronized void addOnlineCount() {
|
|
|
WebSocketServer.onlineCount++;
|
|
|
}
|
|
|
|
|
|
public static synchronized void subOnlineCount() {
|
|
|
WebSocketServer.onlineCount--;
|
|
|
}
|
|
|
|
|
|
public static CopyOnWriteArraySet<WebSocketServer> getWebSocketSet() {
|
|
|
return webSocketSet;
|
|
|
}
|
|
|
}
|