WebSocket 简介

来源:互联网 发布:淘宝刷平台有哪些 编辑:程序博客网 时间:2024/06/04 00:41

传统的http请求是有请求才会有响应,在websocket中只要客户端没有断开websocket链接,就不需要客户端向服务端发起请求,
通过Sec-WebSocket-Key的base64的编码,要求服务器返回一个对应加密的Sec-WebSocket-Accept应答

    //客户端api示例    var ws = new WebSocket("wss://echo.websocket.org");//申请一个WebSocket对象参数是链接服务器的地址,使用ws或wss(安全的)开头    ws.onopen = function(){ws.send("test!");}; // 当browser(浏览器) 和WebSocketServer链接成功后触发noopen    ws.onmessage = function(evt){console.log(evt.data);ws.close();};//当browser接收到发过来的数据后执行onmessage消息,evt参数包含Server传过来的数据    ws.onclose = function(evt){console.log("WebSocket is closed!");};//当browser接收到服务器传过来的close请求后触发onclose消息,    ws.onerror = function(evt){console.log("WebSocket is Error!");}; //当链接失败或者出现错误时就会触发onerror。 
案例介绍:我们是一个手机app软件商,需要实时的获取每个打开app用户的地理位置,设备上线,离线,上报时都要获取设备的地理位置,并精确到秒,我们用A设备对这些手机进行监管,如果用传统的HTTP协议的话,每次A设备都回去询问手机(轮询),当下线时,造成了网络浪费,势必会对A设备带来负载压力。方案解决:采用WebSocket技术实现推送,当手机打开app后,就与a设备建立长链接,实时的向a设备推送当前地理位置,当用户下线时,向a设备发送关闭消息。WebSocket客户端:a设备和手机设备的WebSocket客户端封装在websocket.js的代码中,与Jqurey MobileApp一同打包为移动端apk/ipa安装包。WebSocket服务端:主要为WebSocketDeviceServlet.java,WebSockDeviceInbound.java,websocketDeviceInboundPool.java这几个类中这里只讨论客户端
var websocket=window.WebSocket || window.MozWebSocket;     var isConnected = false;    function doOpen(){        isConnected = true;        if(deviceType=='B'){             mapArea='mapB';             doLoginB(mapArea);         }         else{             mapArea='mapA';             doLoginA(mapArea);         }    }    function doClose(){        showDiagMsg("infoField","已经断开连接", "infoDialog");        isConnected = false;    }    function doError() {        showDiagMsg("infoField","连接异常!", "infoDialog");        isConnected = false;    }    function doMessage(message){        var event = $.parseJSON(message.data);        doReciveEvent(event);    }    function doSend(message) {        if (websocket != null) {            websocket.send(JSON.stringify(message));        } else {            showDiagMsg("infoField","您已经掉线,无法与服务器通信!", "infoDialog");        }    }    //初始话 WebSocket    function initWebSocket(wcUrl) {        if (window.WebSocket) {            websocket = new WebSocket(encodeURI(wcUrl));            websocket.onopen = doOpen;            websocket.onerror = doError;            websocket.onclose = doClose;            websocket.onmessage = doMessage;        }        else{            showDiagMsg("infoField","您的设备不支持 webSocket!", "infoDialog");        }    };    function doReciveEvent(event){        //设备不存在,客户端断开连接        if(event.eventType==101){            showDiagMsg("infoField","设备不存在或设备号密码错!", "infoDialog");            websocket.close();        }        //返回组设备及计算目标位置信息,更新地图        else if(event.eventType==104||event.eventType==103){        clearGMapOverlays(mapB);          $.each(event.eventObjs,function(idx,item){         var deviceNm = item.deviceNm;         //google api        // var deviceLocale = new google.maps.LatLng(item.lag,item.lat);        //baidu api         var deviceLocale = new BMap.Point(item.lng,item.lat);         var newMarker;         if(item.status=='target'){             newMarker = addMarkToMap(mapB,deviceLocale,deviceNm,true);             //…以下代码省略         }     else{     newMarker = addMarkToMap(mapB,deviceLocale,deviceNm);     }      markArray.push(newMarker);     });         showDiagMsg("infoField","有新报修设备或设备离线, 地图已更新!", "infoDialog");    }    }
原创粉丝点击