后端代码SseController.java

  1. package com.theorydance.mywebsocket.server;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.UUID;
  6.  
  7. import org.springframework.web.bind.annotation.CrossOrigin;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
  12. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter.SseEventBuilder;
  13.  
  14. import lombok.extern.slf4j.Slf4j;
  15.  
  16. @CrossOrigin
  17. @RestController
  18. @Slf4j
  19. public class SseController {
  20.  
  21. private Map<String,SseEmitter> emitterMap = new HashMap<>();
  22.  
  23. public SseController() {
  24. log.info("init sseController");
  25. }
  26.  
  27. @GetMapping("/getData")
  28. public SseEmitter getData(@RequestParam String id){
  29. final SseEmitter emitter = new SseEmitter();
  30. emitter.onCompletion(() -> {
  31. emitterMap.remove(id);
  32. log.info("onCompletion");
  33. });
  34.  
  35. emitter.onError(e -> {
  36. emitterMap.remove(id);
  37. log.info("onError:" + e.getMessage());
  38. });
  39.  
  40. emitter.onTimeout(() -> {
  41. emitterMap.remove(id);
  42. log.info("onTimeout");
  43. });
  44.  
  45. try {
  46. emitterMap.put(id,emitter);
  47. }catch (Exception e){
  48. emitter.completeWithError(e);
  49. }
  50. return emitter;
  51. }
  52.  
  53. @GetMapping("/payback")
  54. public String payback(@RequestParam String id){
  55. SseEmitter emitter = emitterMap.get(id);
  56. String res = "推送失败,已关闭";
  57. if(emitter != null){
  58. try {
  59. String uuid = UUID.randomUUID().toString();
  60. SseEventBuilder builder = SseEmitter.event().data(uuid);
  61. emitter.send(builder);
  62. res = "ok";
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. return res;
  68.  
  69. }
  70. }

前端代码:

  1. <body>
  2.  
  3. <script>
  4. /**
  5. * H5 EventSource 实现web页面推送功能demo
  6. */
  7.  
  8. var serverData,statusDiv;
  9. var SERVER_URL = "http://localhost:8080/demo/getData?id=11"; //servers Url Adress
  10.  
  11. window.onload = function(){
  12. startlistenServer();
  13. }
  14.  
  15. function startlistenServer(){
  16. var es = new EventSource(SERVER_URL);
  17. //es.addEventListener("newDate",newDateHandler);
  18. es.onopen =openHandler;
  19. es.onerror = errorHandler;
  20. es.onmessage = messageHandler;
  21. }
  22.  
  23. function openHandler(e){
  24. console.log('openHandler');
  25. }
  26.  
  27. function errorHandler(e){
  28. console.log('errorHandler');
  29. }
  30.  
  31. function messageHandler(e){
  32. console.log(e.data);
  33. }
  34.  
  35. function newDateHandler(e){
  36. serverData.innerHTML = e.data;
  37. }
  38. </script>
  39. </body>

后面贴一个图,我自己的总结,如果发现什么不对的描述,请留言

SseEmitter推送的更多相关文章

  1. 服务器端实时推送技术之SseEmitter的用法

    这是SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其se ...

  2. 我有 7种 实现web实时消息推送的方案,7种!

    技术交流,公众号:程序员小富 大家好,我是小富- 我有一个朋友- 做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能. 不过他还没想好用什么方式做,这里 ...

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

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

  4. iOS---iOS10适配iOS当前所有系统的远程推送

    一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...

  5. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  6. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  7. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  8. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  9. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

随机推荐

  1. 11.java设计模式之享元模式

    基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...

  2. 创建Spring Cloud聚合项目

    使用maven创建单一项目的时候通常用不到聚合项目,创建spring cloud项目时候,由于下面都是一个一个微服务,每个服务对应一个项目,这就需要用到聚合项目,方便对依赖和项目之间的关系进行管理,使 ...

  3. 我要进大厂之大数据ZooKeeper知识点(1)

    01 让我们一起学大数据 老刘又回来啦!在实验室师兄师姐都找完工作之后,在结束各种科研工作之后,老刘现在也要为找工作而努力了,要开始大数据各个知识点的复习总结了.老刘会分享出自己的知识点总结,一是希望 ...

  4. 前端web安全-CSRF基础入门

    前言 今天找了个新地方进行学习 嘿嘿  采光不错!特别适合看书呢. 前言 1.CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click att ...

  5. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  6. webug第十五关:什么?图片上传不了?

    第十五关:什么?图片上传不了? 直接上传php一句话失败,将content type改为图片 成功

  7. Java 中常见的细粒度锁实现

    上篇文章大致说了下 ReentrantLock 类的使用,对 ReentrantLock 类有了初步的认识之后让我们一起来看下基于 ReentrantLock 的几种细粒度锁实现. 这里我们还是接着用 ...

  8. 凭借着这份Spring面试题,我拿到了阿里,字节跳动美团的offer!

      一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能?   1.2. 什么是 Spring Framework? Spring 是一个开源应用框架,旨在降低应用程序开发 ...

  9. FL Studio中的音频剪辑功能

    音频剪辑是FL Studio中的特色功能,音频剪辑的目的是保持在播放列表中显示和触发的音频,可以根据需要对它们进行切片和排列.但音频剪辑这个功能在FL Studio的基础版中是没有的. 图1:音频剪辑 ...

  10. 10、Spring Boot分布式

    1.分布式简介  2.Zookeeper和Dubbo  3.zookeeper (1).zookeeper安装 官方文档:https://hub.docker.com/_/zookeeper?tab= ...