H5 WebSocket java服务端push

Stella981
• 阅读 653

1.pom

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>

这里使用javax.websocket,没有使用springmvc.websocket。

2.服务端 java代码

/***
 * webScoket服务.</br>
 * format URL as ws://ip:port/{finalName}/websocket/{module}/{key}
 * 
 * 
 * @author svili
 * @data 2017年7月12日
 *
 */
/**component注解是为了使用spring容器的依赖注入,以实现服务端push()*/
@Component
@ServerEndpoint(value = "/websocket/{module}/{key}")
public class SimpleWebSocket {

    /** key = {module.key} */
    private static ConcurrentHashMap<String, Set<Session>> consumers = new ConcurrentHashMap<String, Set<Session>>();

    /**
     * 连接建立成功调用的方法
     * 
     * @param session
     *            session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(@PathParam("module") String module, @PathParam("key") String key, Session session) {

        if (!consumers.containsKey(module + "." + key)) {
            Set<Session> group = new HashSet<Session>();
            group.add(session);
            consumers.put(module + "." + key, group);
        } else {
            consumers.get(module + "." + key).add(session);
        }

    }

    @OnMessage
    public void onMessage(@PathParam("module") String module, @PathParam("key") String key, String message,
            Session session) throws IOException {

        push(module, key, message);

    }

    @OnClose
    public void onClose(@PathParam("module") String module, @PathParam("key") String key, Session session) {
        Set<Session> group = consumers.get(module + "." + key);
        if (group != null) {

            group.remove(session);
        }
    }

    @OnError
    public void onError(@PathParam("module") String module, @PathParam("key") String key, Session session,
            Throwable error) {
        throw new RuntimeException(error);
    }

    /** 消息推送 */
    public boolean push(String module, String key, String message) throws IOException {
        Set<Session> group = consumers.get(module + "." + key);
        if (group != null) {

            for (Session consumer : group) {
                consumer.getBasicRemote().sendText(message);
            }
        }
        return true;
    }

}

3.客户端(浏览器)JS代码

<script type="text/javascript">  
      var websocket = null;  
         
      //判断当前浏览器是否支持WebSocket  
      if('WebSocket' in window){  
          websocket = new WebSocket("ws://ip:port/finalName/websocket/{module}/{key}");  
      }  
      else{  
          alert('Not support websocket');  
      }  
         
      //连接发生错误的回调方法  
      websocket.onerror = function(event){  
          alert("error");  
      };  
         
      //连接成功建立的回调方法  
      websocket.onopen = function(){  
          alert("open");  
      }  
         
      //接收到消息的回调方法  
      websocket.onmessage = function(event){  
          alert('recive : ' + event.data);  
      }  
         
      //连接关闭的回调方法  
      websocket.onclose = function(event){  
          alert("close");  
      }  
         
      //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
      window.onbeforeunload = function(){  
          websocket.close();  
      }  
         
      //发送消息  
      function send(message){  
          websocket.send(message);  
      }  
  </script>

4.服务端push

@RestController
@RequestMapping(value = "/websocket/test")
public class SocketTest {

    @Resource
    private SimpleWebSocket publisher;

    @RequestMapping("/push")
    public JsonModel push(String module, String key, String message) {
        try {
            publisher.push(module, key, message);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //JsonModel是自定义的javaBean
        return JsonModel.success("success");
    }

}
点赞
收藏
评论区
推荐文章
执键写春秋 执键写春秋
3年前
MyBatis进阶使用(日志管理、动态SQL、二级缓存、多表联级、Pagehelper分页、批处理)
MyBatis进阶使用日志管理依赖使用Logback进行日志管理:<dependency<groupIdch.qos.logback</groupId<artifactIdlogbackclassic</artifactId<version1.3.0alpha5</version</dependency
Easter79 Easter79
3年前
springboot接入微信app支付
一:集成步骤1.引入依赖:<dependency<groupIdcom.github.wxpay</groupId<artifactIdwxpaysdk</artifactId<version0.0.3</version</dependency
Easter79 Easter79
3年前
SpringBoot权限管理开发实战2
1.添加依赖<dependency<groupIdorg.mybatis.spring.boot</groupId<artifactIdmybatisspringbootstarter</artifactId<version2.1.1</version</dependency<dependency<groupI
Wesley13 Wesley13
3年前
1.WebSocket编程—Hello World
1.引入jar包<dependencies<!servlet<dependency<groupIdjavax.servlet</groupId<artifactIdjavax.servletapi</artifactId<ve
Stella981 Stella981
3年前
HttpClient 实现 socks 代理
HttpClient实现socks代理使用的环境<dependency<groupIdorg.apache.httpcomponents</groupId<artifactIdhttpclient</artifactId<version4.4.1</version</dependency
Easter79 Easter79
3年前
Springmvc 发送邮件功能
1、引入相关jar包<dependency<groupIdorg.apache.velocity</groupId<artifactIdvelocity</artifactId<version1.7</version</dependency
Stella981 Stella981
3年前
SpringBoot权限管理开发实战2
1.添加依赖<dependency<groupIdorg.mybatis.spring.boot</groupId<artifactIdmybatisspringbootstarter</artifactId<version2.1.1</version</dependency<dependency<groupI
Stella981 Stella981
3年前
ElasticSearch Java API 增删改查操作
1.添加pom.xml依赖<dependency<groupIdjunit</groupId<artifactIdjunit</artifactId<version4.11</version<scopetest</scope</dependency<dependency<groupI
Stella981 Stella981
3年前
HTTP请求客户端工具类
1.maven引入依赖<dependency<groupIdcommonshttpclient</groupId<artifactIdcommonshttpclient</artifactId<version3.1</version</dependency<!https://mvnrepos
Wesley13 Wesley13
3年前
Java原生API访问MongoDB
1.pom.xml<dependency<groupIdorg.mongodb</groupId<artifactIdmongojavadriver</artifactId<version3.5.0</version</dependency2.Java代码