因为做通信项目的时候,需要实时获取每个分机的当前状态,发现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>();

}

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

WebSocket 的一些简单页面推送使用的更多相关文章

  1. 基于page的简单页面推送技术

    我们可以先看下简单效果,打开2个页面可以看到推送效果 服务端我们只需要下面一个方法 using System; using System.Collections.Generic; using Syst ...

  2. 结合实际需求,在webapi内利用WebSocket建立单向的消息推送平台,让A页面和服务端建立WebSocket连接,让其他页面可以及时给A页面推送消息

    1.需求示意图 2.需求描述 原本是为了给做unity3d客户端开发的同事提供不定时的消息推送,比如商城购买道具后服务端将道具信息推送给客户端. 本篇文章简化理解,用“相关部门开展活动,向全市人民征集 ...

  3. Spring之WebSocket网页聊天以及服务器推送

    Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring ...

  4. 最简单的推送--uexGetui

    个推插件使用指南 配置方法这里不再复述,详情请参见插件接入指引 怎样创建一个最简单的推送? //只需要两个方法 uexGetui.initialize(data); uexGetui.onInitia ...

  5. H5 EventSource 实现web页面推送功能demo

    /** * H5 EventSource 实现web页面推送功能demo */ var serverData,statusDiv; var SERVER_URL = "index.php&q ...

  6. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  7. Android中脱离WebView使用WebSocket实现群聊和推送功能

    WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...

  8. v-charts 和 websocket实现数据展示动态推送

    v-charts https://v-charts.js.org/#/ ELEMENT力作: 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出 ...

  9. Django2.0.4 + websocket 实现实时通信,主动推送,聊天室及客服系统

    webSocket是一种在单个TCP连接上进行全双工通信的协议. webSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器 ...

随机推荐

  1. 内存转储文件 Memory.dmp

    https://baike.sogou.com/v63435711.htm?fromTitle=内存转存文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途 ...

  2. 设计模式-(8)外观(swift版)

    一,概念 为子系统中的一组接口提供一个统一的接口.外观模式定义了一个更高层次的接口,这个接口使得这一子系统更加容易使用. 二,结构图 (1)SubSystem子系统类:每个子系统定义了相关功能和模块的 ...

  3. mongodb01--安装

    配置Mongo服务端 安装MongoDB 1.按照操作系统下载http://www.mongodb.org/downloads. 2.在D盘新建MongoDB文件夹(此文件夹为自定义的数据库安装目录D ...

  4. 使用PXE安装CentOS7

    1.环境 本文使用VMware 虚拟机进行实验. 点击VMware--编辑--虚拟网络编辑器,新建VMnet15,选择仅主机模式,取消勾选DHCP服务(因为这里使用自己的DHCP服务).我这里配好后是 ...

  5. easy_install uncompyle6 egg

    localhost:~ # easy_install uncompyle6-3.0.1-py3.6.eggProcessing uncompyle6-3.0.1-py3.6.eggCopying un ...

  6. lucene DocValues——没有看懂

    前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来的 ...

  7. 手把手VirtualBox虚拟机下安装rhel6.4 linux位系统详细文档

    使用Virtual Box,感觉跟Vmware差不多,我的本子的系统是win7 64位. 下面演示安装的是在VirtualBox里安装rhel 6.4 linux 32位系统.32位系统安装和 64位 ...

  8. 学习笔记::AC自动机

    最先开始以为和自动刷题机是一个东西... 其实就是kmp的一个拓展.学完kmp再学这个就会发现其实不难 1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有 ...

  9. OSI模型与TCP/IP模型基础

    一.OSI七层模型 OSI(Open System Interconnection),OSI是一个开放性的通行系统互连参考模型,是一个协议规范.OSI七层模型是一种框架性的设计方法 ,建立七层模型的主 ...

  10. 476. Number Complement(补数)

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...