• WebSocket 的一些简单页面推送使用


    因为做通信项目的时候,需要实时获取每个分机的当前状态,发现websocket还不错,只是对浏览器的要求比较高,

    针对特定用户推送消息,网上有一些

    public class GetHttpSessionConfigurator  extends ServerEndpointConfig.Configurator{

     
     @Override
     public void modifyHandshake(ServerEndpointConfig config,HandshakeRequest request,HandshakeResponse response){
      HttpSession httpSession = (HttpSession)request.getHttpSession();
      config.getUserProperties().put(HttpSession.class.getName(),httpSession);
      }
     
    }

    //@ServerEndpoint(value="/websocket",configurator=GetHttpSessionConfigurator.class)

    在open方法加入参数,进行实现,最后发现获取不到session,为null。 然后通过他们说的在监听器内,把session也加入,最后可以获取session,却发现用户的session会改变

    两个httpSession 不是一个值。实在没办法用啦下面的法子。。。。。。。。

    实际点,代码奉上:

    jsp:

    <script type="text/javascript">
    var BASE_PATH="${pageContext.request.contextPath}";//项目名称
    var iphost="${iphost}";//服务器ip+端口
    var session="${session}";//针对特定用户推送时,实在找不到方法只能笨点,把每个用户放去缓存,通过后台闯入页面
    var ws;
    $(function(){
        ws = new WebSocket("ws://"+iphost+"/${pageContext.request.contextPath }/websocket?"+session);
        ws.onopen = function(evn){
            //console.log(evn);
        };
        ws.onmessage = function(evn){              
            var data = evn.data+'';
            //console.log(data);
            if(data.indexOf("挂机原因")>-1){
             UIkit.modal.alert(evn.data);
            }else if(data.indexOf("来电弹屏")>-1){
             var tpphone=data.replace("来电弹屏", "");
             var rw=document.body.clientWidth-800;
          var rh=document.body.clientHeight-600;
          window.open(BASE_PATH+'/main/asterisktest/bomb?phone='+tpphone,"","toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, width=800, height=600,top="+rh+", left="+rw);

            }else{
            var json=eval('('+data+')');      
            var div = $("#"+json["id"]);
            div.html(json["statusname"]);
            }
        };
        ws.onclose = function(evn){
            //console.log("关闭");
        };
        ws.onError=function(evn){
         // console.log('Error occured: ' + evt.data);
          };
    });
    </script>

    java:

    //@ServerEndpoint(value="/websocket",configurator=GetHttpSessionConfigurator.class)
    @ServerEndpoint(value="/websocket")
    public class WebSocket  {
      public WebSocket(){
            
         }
      //给所有的用户推送消息
      public static void broadcastAll(JSONObject jsono){ 
     
       ListIterator it=WEBApp.AppSession.listIterator();
                while(it.hasNext()){
                   try { 
                    ((Session)it.next()).getBasicRemote().sendText(jsono.toString()); 
                       
                    } catch (Exception e) { 

                       e.printStackTrace(); 

                   } 

                } 

            }
         //给指定用户发送消息
       public static void broadcast(String key,String value){
        MapCacheUtil mapc=MapCacheUtil.getInstance();
        try {
         if(mapc.getWebsession(key)!=null){
        mapc.getWebsession(key).getBasicRemote().sendText(value);
         }
       } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
       }
     
     
         @OnOpen//,EndpointConfig config
         public void onopen(Session session){
             System.out.println("连接成功");
             MapCacheUtil mapc=MapCacheUtil.getInstance();
             mapc.putWebsession(session.getQueryString(), session);
             try {
              WEBApp.AppSession.add(session);                    
                 session.getBasicRemote().sendText("hello client...");
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         @OnClose
         public void onclose(Session session){
          WEBApp.AppSession.remove(session);
             System.out.println(session.getId()+"close....");
            
         }
          @OnMessage     
         public void onsend(Session session,String msg){
             try {      
         session.getBasicRemote().sendText(msg);
        
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }

    //保存所有Websocket Session 的值

    public class WEBApp {

    public static Vector<javax.websocket.Session>
    AppSession=new Vector<javax.websocket.Session>();

    }

    也没什么经验,不足的大家提出建议,起码功能实现啦。。

  • 相关阅读:
    sed 搜索并替换
    error: call of overloaded ‘sqrt(double&)’ is ambiguous
    C++数组读入MATLAB数据
    Ubuntu 18.04 安装 Octave 5.1
    Ubuntu 18.04 安装 CUDA 9.0
    LSTM 神经网络输入输出层
    tf.nn.rnn_cell.MultiRNNCell
    w = tf.Variable(<initial-value>, name=<optional-name>)
    linux下修改环境变量
    linux内核编程学习——草稿
  • 原文地址:https://www.cnblogs.com/cbdd/p/5497198.html
Copyright © 2020-2023  润新知