1、webSocket实现代码
@Component
public class WebSocketStompConfig {
//这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket
// ,如果你使用外置的tomcat就不需要该配置文件
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
@Component
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocket {
private static int onlineCount = 0;
private static ConcurrentHashMap<String, Set<Session>> webSocketMap = new ConcurrentHashMap<>();
private Session session;
@OnOpen
public void onOpen(Session session) {
this.session = session;
// 获取URL中的参数
Map<String, List<String>> params = session.getRequestParameterMap();
List<String> funcTypes = params.get("funcType");
if (!funcTypes.isEmpty()) {
// 取出funcType参数的值
String funcType = funcTypes.get(0);
if(webSocketMap.containsKey(funcType)){
webSocketMap.get(funcType).add(session);
}else{
Set<Session> sessionSet = new HashSet<>();
sessionSet.add(session);
webSocketMap.put(funcType,sessionSet);
}
}
System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
}
@OnClose
public void onClose(){
webSocketMap=new ConcurrentHashMap<>();
log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("来自客户端的消息:" + message);
}
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
public static void sendMessage(Session session, String message) throws IOException {
session.getBasicRemote().sendText(message);
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocket.onlineCount--;
}
public static void setOnlineCount(int onlineCount) {
WebSocket.onlineCount = onlineCount;
}
public static ConcurrentHashMap<String, Set<Session>> getWebSocketMap() {
return webSocketMap;
}
public static void setWebSocketMap(ConcurrentHashMap<String, Set<Session>> webSocketMap) {
WebSocket.webSocketMap = webSocketMap;
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
/**
* 发送自定义消息
* */
public static void sendInfo(String message,String funcType) throws Exception {
if(webSocketMap.containsKey(funcType)){
Set<Session> sessionSet = webSocketMap.get(funcType);
if(sessionSet!=null){
for (Session session : sessionSet) {
if(session.getBasicRemote()!=null){
session.getBasicRemote().sendText(message);
}
}
}
}else{
log.error("订阅类型:"+funcType+",不存在!");
throw new Exception("连接已关闭,请刷新页面后重试");
}
}
}
二、java代码调用,往websocker赋数据
WebSocket.sendInfo(JSON.toJSONString("sdfasd232"),"3");
三、测试是否连接成功以及推送信息
四、前端代码处理
/**
* 初始化websocket连接
*/
function initWebSocket() {
var websocket = null;
if('WebSocket' in window) {
websocket = new WebSocket("ws://127.0.0.1:8080/webSocket?funcType=3" );
} else {
alert("该浏览器不支持websocket!");
}
websocket.onopen = function(event) {
console.log("建立连接");
websocket.send('Hello WebSockets!');
}
websocket.onclose = function(event) {
console.log('连接关闭')
reconnect(); //尝试重连websocket
}
//建立通信后,监听到后端的数据传递
websocket.onmessage = function(event) {
let data = JSON.parse(event.data);
//业务处理....
if(data.step == 1){
alert(data.msg);
}
}
websocket.onerror = function() {
// notify.warn("websocket通信发生错误!");
// initWebSocket()
}
window.onbeforeunload = function() {
websocket.close();
}
// 重连
function reconnect() {
console.log("正在重连");
// 进行重连
setTimeout(function () {
initWebSocket();
}, 1000);
}