zoukankan      html  css  js  c++  java
  • websocket使用

    兼容性介绍 : https://caniuse.com/#search=websockets

    var websocket = null;
     
    //判断当前浏览器是否支持WebSocket
    if ('WebSocket' in window) {
        //websocket = new WebSocket("ws://192.168.1.58:8080/plant/servlet/PushMessage");
        websocket = new WebSocket("ws://" + $("#webSocketIp").val() + ":" + $("#webSocketPort").val() + "/plant/servlet/PushMessage");
    }
    else {
        alert('Not support websocket')
    }
     
    //连接发生错误的回调方法
    websocket.onerror = function () {
     
    };
     
    //连接成功建立的回调方法
    websocket.onopen = function (event) {
     
    };
     
    //接收到消息的回调方法
    websocket.onmessage = function (event) {
        var message = eval("(" + event.data + ")");//转换后的JSON对象
        //  alert(obj.name);//json name
        var url = window.location.href;
        switch (message.header) {
            case "nodeOffline":
                if (message.concentId == $("#concentId").val()) {
                    $("#onlineState").attr("src", "images/photos/offline.png");
                }
                updateConcentLogs(message);
                break;
            case "nodeOnline":
                if (message.concentId == $("#concentId").val()) {
                    $("#onlineState").attr("src", "images/photos/online.png");
                }
                updateConcentLogs(message);
                break;
            case "sensorAlarm":
                if (message.regionId == regionId) {
                    updateSensorAlarm(message);
                }
                break;
            case "sensorCurrentData":
                if (message.schemeId == schemeId) {
                    if(url.indexOf("main")>0){
                        drawCurrentData(message);
                    }
                    if(url.indexOf("monitor")>0){
                        changeCurrentData(message);
                    }
     
                }
                break;
            case "deviceSwitchOperate":
                //ionic对设备开关操作的推送
                if (nodeId == message.nodeId) {
                    //如果当前显示界面显示的为推送过来的设备的开关状态,则改变其状态
                    switchState = message.switchState;
                    $("#deviceRow img").attr("src", switchState ? "images/photos/switchOn.png" : "images/photos/switchOff.png");
                }
                break;
            case "lampSwitchOperate":
                //ionic对植物灯开关操作的推送
                if (nodeId == message.nodeId) {
                    //如果当前显示界面显示的为推送过来的植物灯的开关状态,则改变其状态
                    switchState = message.switchState;
                    $("#lampRow img").attr("src", switchState ? "images/photos/switchOn.png" : "images/photos/switchOff.png");
                }
                break;
        }
    }
     
    //连接关闭的回调方法
    websocket.onclose = function () {
     
    }
     
    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function () {
        websocket.close();
    }
     
     
    //关闭连接
    function closeWebSocket() {
        websocket.close();
    }
     
    //发送消息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
     
    function formatEventType(concentEventType) {
        var eventType = '';
        switch (concentEventType) {
            case "ON_LINE":
                eventType = "上线";
                break;
            case "OFF_LINE":
                eventType = "下线";
                break;
        }
        return eventType;
    }
     
    function updateConcentLogs(message) {
        var timeItems = $("#concentLogs").find("div[class='time-item']");
        if (timeItems.length > 0) {
            var newFirst = "" +
                "<div class='time-item' >" +
                "<div class='item-info'>" +
                "<small class='text-muted'>" +
                message.createTime +
                "</small> " +
                "<p><strong><a href='#' class='text-info'>" + message.concentName + "</a></strong>" +
                formatEventType(message.concentEventType) +
                "</p> " +
                "</div>" +
                "</div>";
            $(timeItems[0]).before(newFirst);
            $(timeItems[timeItems.length - 1]).remove();
        }
    }
     
    function updateSensorAlarm(message) {
        var timeItems = $("#sensorAlarm a");
        if (timeItems.length > 0) {
            var newFirst = "<a href='#' class='dropdown-item notify-item'>" +
                "<div class='notify-icon bg-success'><i class='icon-notebook'></i></div>" +
                "<p class='notify-details'>" + message.content +
                "<small class='text-muted'>" + message.createTime + "</small>" +
                "</p>" +
                "</a>";
            $(timeItems[0]).before(newFirst);
            $(timeItems[timeItems.length - 1]).remove();
        }
        $("#alarmNotice").removeAttr("hidden")
    }
    

     server:

    package net.microlinktech.plant.web.servlet;
     
    import org.apache.log4j.Logger;
     
    import javax.websocket.*;
    import javax.websocket.server.ServerEndpoint;
    import java.util.concurrent.CopyOnWriteArraySet;
     
     
    @ServerEndpoint("/servlet/PushMessage")
    public class PushWebSocketServlet {
     
        private static Logger logger = Logger.getLogger(PushWebSocketServlet.class);
     
        // 静态变量,用来记录当前在线连接数。
        private static volatile int onlineCount = 0;
     
        // concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
        private static CopyOnWriteArraySet<PushWebSocketServlet> webSocketSet = new CopyOnWriteArraySet<>();
     
        // 与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
     
        /**
         * 连接建立成功调用的方法
         *
         * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
         */
        @OnOpen
        public void onOpen(Session session) {
            this.session = session;
            webSocketSet.add(this);     //加入set中
            addOnlineCount();           //在线数加1
            logger.info("有新连接加入!当前在线客户端为" + getOnlineCount());
        }
     
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            webSocketSet.remove(this);  //从set中删除
            subOnlineCount();           //在线数减1
     
            logger.info("有一连接关闭!当前在线客户端为" + getOnlineCount());
        }
     
        @OnMessage
        public void onMessage (String txt, Session session) {
            System.out.println("onMessage: " + txt.toUpperCase());
        }
     
        /**
         * 发生错误时调用
         *
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
            logger.error("发生错误", error);
        }
     
        /**
         * 发送消息到客户端
         *
         * @param message
         */
        public void sendMessage(String message) {
    //        this.session.getBasicRemote().sendText(message);
            this.session.getAsyncRemote().sendText(message);
        }
     
        /**
         * 群发消息
         *
         * @param message
         */
        public static void pushMessage(String message) {
            for (PushWebSocketServlet item : webSocketSet) {
                item.sendMessage(message);
            }
        }
     
        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
     
        public static synchronized void addOnlineCount() {
            onlineCount++;
        }
     
        public static synchronized void subOnlineCount() {
            onlineCount--;
        }
    }
    

      



    https://www.tongbiao.xyz/
  • 相关阅读:
    牛客练习赛71 F-红蓝图 (kruskal重构树 + 线段树合并)
    2020杭电多校第一场 Finding a MEX
    Codeforces 235C Cyclical Quest (后缀自动机)
    HDu6583 Typewriter (后缀自动机 + dp)
    2020牛客暑期多校训练营(第八场)A All-Star Game
    HDu4416 Good Article Good sentence (后缀自动机)
    icpc小米 A . Intelligent Warehouse
    计数类dp
    主席树
    博弈论
  • 原文地址:https://www.cnblogs.com/tongbiao/p/9332878.html
Copyright © 2011-2022 走看看