博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
websocket使用
阅读量:6154 次
发布时间:2019-06-21

本文共 6213 字,大约阅读时间需要 20 分钟。

兼容性介绍 : https://caniuse.com/#search=websockets
var websocket = null; //判断当前浏览器是否支持WebSocketif ('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 = "" +            "
" + "
" + "
" + message.createTime + " " + "

" + message.concentName + "" + formatEventType(message.concentEventType) + "

" + "
" + "
"; $(timeItems[0]).before(newFirst); $(timeItems[timeItems.length - 1]).remove(); }} function updateSensorAlarm(message) { var timeItems = $("#sensorAlarm a"); if (timeItems.length > 0) { var newFirst = "" + "
" + "

" + message.content + "" + message.createTime + "" + "

" + "
"; $(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
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.cnblogs.com/tongbiao/p/9332878.html

你可能感兴趣的文章
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
UML类图简明教程
查看>>
java反编译工具(Java Decompiler)
查看>>
Android开发之自定义对话框
查看>>
微信Access Token 缓存方法
查看>>
Eclipsed的SVN插件不能识别之前工作空间的项目
查看>>
Linux 查看iptables状态-重启
查看>>
amazeui学习笔记一(开始使用2)--布局示例layouts
查看>>
c#中lock的使用(用于预约超出限额的流程)
查看>>
ODI基于源表时间戳字段获取增量数据
查看>>
并发容器之CopyOnWriteArrayList(转载)
查看>>
什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么
查看>>
原创:goldengate从11.2升级到12.1.2
查看>>