|  | @@ -0,0 +1,66 @@
 | 
	
		
			
				|  |  | +package com.genersoft.iot.vmp.conf.webLog;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import javax.websocket.*;
 | 
	
		
			
				|  |  | +import javax.websocket.server.ServerEndpoint;
 | 
	
		
			
				|  |  | +import java.io.IOException;
 | 
	
		
			
				|  |  | +import java.util.concurrent.ConcurrentHashMap;
 | 
	
		
			
				|  |  | +import java.util.concurrent.ConcurrentMap;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@ServerEndpoint(value = "/channel/log")
 | 
	
		
			
				|  |  | +@Slf4j
 | 
	
		
			
				|  |  | +public class LogChannel {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public static final ConcurrentMap<String, LogChannel> CHANNELS = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private Session session;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @OnMessage(maxMessageSize = 1) // MaxMessage 1 byte
 | 
	
		
			
				|  |  | +    public void onMessage(String message) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        log.debug("Recv Message: {}", message);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            this.session.close(new CloseReason(CloseReason.CloseCodes.TOO_BIG, "此节点不接收任何客户端信息"));
 | 
	
		
			
				|  |  | +        } catch (IOException e) {
 | 
	
		
			
				|  |  | +            log.error("[Web-Log] 连接关闭失败: id={}, err={}", this.session.getId(), e.getMessage());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @OnOpen
 | 
	
		
			
				|  |  | +    public void onOpen(Session session, EndpointConfig endpointConfig) {
 | 
	
		
			
				|  |  | +        this.session = session;
 | 
	
		
			
				|  |  | +        this.session.setMaxIdleTimeout(0);
 | 
	
		
			
				|  |  | +        CHANNELS.put(this.session.getId(), this);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        log.info("[Web-Log] 连接已建立: id={}", this.session.getId());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @OnClose
 | 
	
		
			
				|  |  | +    public void onClose(CloseReason closeReason) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        log.info("[Web-Log] 连接已断开: id={}, err={}", this.session.getId(), closeReason);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        CHANNELS.remove(this.session.getId());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @OnError
 | 
	
		
			
				|  |  | +    public void onError(Throwable throwable) throws IOException {
 | 
	
		
			
				|  |  | +        log.info("[Web-Log] 连接错误: id={}, err= ", this.session.getId(), throwable);
 | 
	
		
			
				|  |  | +        this.session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, throwable.getMessage()));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Push messages to all clients
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param message
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static void push(String message) {
 | 
	
		
			
				|  |  | +        CHANNELS.values().stream().forEach(endpoint -> {
 | 
	
		
			
				|  |  | +            if (endpoint.session.isOpen()) {
 | 
	
		
			
				|  |  | +                endpoint.session.getAsyncRemote().sendText(message);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |