WebSocket 简介

传统的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");
    }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值