package com.terra.system.service.all;
|
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.PostConstruct;
|
import javax.websocket.*;
|
import javax.websocket.server.ServerEndpoint;
|
import java.io.IOException;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
/**
|
* WebSocket服务类
|
* @author WWW
|
*/
|
@ServerEndpoint(value = "/ws/select")
|
@Component
|
public class WebSocketService {
|
@PostConstruct
|
public void init() {
|
System.out.println("websocket 加载...");
|
}
|
|
private final static Logger log = LoggerFactory.getLogger(WebSocketService.class);
|
|
private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0);
|
|
/**
|
* 用来存放每个客户端对应的Session对象(线程安全Set)
|
*/
|
private final static CopyOnWriteArraySet<Session> SESSION_SET = new CopyOnWriteArraySet<Session>();
|
|
/**
|
* 连接建立成功调用的方法
|
*/
|
@OnOpen
|
public void onOpen(Session session) {
|
SESSION_SET.add(session);
|
|
int cnt = ONLINE_COUNT.incrementAndGet();
|
log.info("有连接加入,当前连接数为:{}", cnt);
|
sendMessage(session, "连接成功");
|
}
|
|
/**
|
* 连接关闭调用的方法
|
*/
|
@OnClose
|
public void onClose(Session session) {
|
SESSION_SET.remove(session);
|
|
int cnt = ONLINE_COUNT.decrementAndGet();
|
log.info("有连接关闭,当前连接数为:{}", cnt);
|
}
|
|
/**
|
* 收到客户端消息后调用的方法
|
*
|
* @param message 客户端发送过来的消息
|
*/
|
@OnMessage
|
public void onMessage(String message, Session session) {
|
log.info("来自客户端的消息:{}", message);
|
sendMessage(session, "收到消息,消息内容:" + message);
|
}
|
|
/**
|
* 出现错误
|
*
|
* @param session
|
* @param error
|
*/
|
@OnError
|
public void onError(Session session, Throwable error) {
|
log.error("发生错误:{},Session ID: {}", error.getMessage(), session.getId());
|
}
|
|
/**
|
* 发送消息,实践表明,每次浏览器刷新,session会发生变化。
|
*
|
* @param session
|
* @param message
|
*/
|
public static void sendMessage(Session session, String message) {
|
try {
|
session.getBasicRemote().sendText(String.format("%s", message));
|
} catch (Exception ex) {
|
log.error("发送消息出错:{}", ex.getMessage());
|
}
|
}
|
|
/**
|
* 群发消息
|
*
|
* @param message
|
* @throws IOException
|
*/
|
public static void broadCastInfo(String message) throws IOException {
|
for (Session session : SESSION_SET) {
|
if (session.isOpen()) {
|
sendMessage(session, message);
|
}
|
}
|
}
|
|
/**
|
* 指定Session发送消息
|
*
|
* @param sessionId
|
* @param message
|
* @throws IOException
|
*/
|
public static void sendMessage(String message, String sessionId) throws IOException {
|
Session session = null;
|
for (Session s : SESSION_SET) {
|
if (s.getId().equals(sessionId)) {
|
session = s;
|
break;
|
}
|
}
|
|
if (session != null) {
|
sendMessage(session, message);
|
} else {
|
log.info("没有找到你指定ID的会话:{}", sessionId);
|
}
|
}
|
}
|