SseEmitter推送
后端代码SseController.java
package com.theorydance.mywebsocket.server; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter.SseEventBuilder; import lombok.extern.slf4j.Slf4j; @CrossOrigin
@RestController
@Slf4j
public class SseController { private Map<String,SseEmitter> emitterMap = new HashMap<>(); public SseController() {
log.info("init sseController");
} @GetMapping("/getData")
public SseEmitter getData(@RequestParam String id){
final SseEmitter emitter = new SseEmitter();
emitter.onCompletion(() -> {
emitterMap.remove(id);
log.info("onCompletion");
}); emitter.onError(e -> {
emitterMap.remove(id);
log.info("onError:" + e.getMessage());
}); emitter.onTimeout(() -> {
emitterMap.remove(id);
log.info("onTimeout");
}); try {
emitterMap.put(id,emitter);
}catch (Exception e){
emitter.completeWithError(e);
}
return emitter;
} @GetMapping("/payback")
public String payback(@RequestParam String id){
SseEmitter emitter = emitterMap.get(id);
String res = "推送失败,已关闭";
if(emitter != null){
try {
String uuid = UUID.randomUUID().toString();
SseEventBuilder builder = SseEmitter.event().data(uuid);
emitter.send(builder);
res = "ok";
} catch (Exception e) {
e.printStackTrace();
}
}
return res; }
}
前端代码:
<body> <script>
/**
* H5 EventSource 实现web页面推送功能demo
*/ var serverData,statusDiv;
var SERVER_URL = "http://localhost:8080/demo/getData?id=11"; //servers Url Adress window.onload = function(){
startlistenServer();
} function startlistenServer(){
var es = new EventSource(SERVER_URL);
//es.addEventListener("newDate",newDateHandler);
es.onopen =openHandler;
es.onerror = errorHandler;
es.onmessage = messageHandler;
} function openHandler(e){
console.log('openHandler');
} function errorHandler(e){
console.log('errorHandler');
} function messageHandler(e){
console.log(e.data);
} function newDateHandler(e){
serverData.innerHTML = e.data;
}
</script>
</body>
后面贴一个图,我自己的总结,如果发现什么不对的描述,请留言

SseEmitter推送的更多相关文章
- 服务器端实时推送技术之SseEmitter的用法
这是SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其se ...
- 我有 7种 实现web实时消息推送的方案,7种!
技术交流,公众号:程序员小富 大家好,我是小富- 我有一个朋友- 做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能. 不过他还没想好用什么方式做,这里 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- iOS---iOS10适配iOS当前所有系统的远程推送
一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- SignalR SelfHost实时消息,集成到web中,实现服务器消息推送
先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- Android 几种消息推送方案总结
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
随机推荐
- Python项目1:自动添加标签
本项目取材自<Python基础教程(第三版)>人民邮电出版社 目标: 本项目给纯文本文件添加格式,使文档转换成其他类型的文档(以HTML为例) 思路: 从原文件提取有用信息: 文档结构-- ...
- linux解释器、内建和外建命令
查看系统是哪种命令解释器: [root@localhost ~]# echo $SHELL /bin/bash 内建命令:是shell程序的一部分,包含的是一些比较简单的linux系统命令,这些命令由 ...
- MySQL_where和having的区别
1. where和having都可以使用的场景 select goods_price,goods_name from sw_goods where goods_price > 100 selec ...
- ImportError: No module named 'chardet'
1.使用requsets出现这个错误,ImportError: No module named 'chardet' 原因:requests依赖其他一些模块 解决:依次使用pip安装即可 pip ins ...
- metasploit数据库使用学习
metasploit为了方便,自动将当前工作区的内容放入数据库 首先就是工作区 -a 增加工作区,-d删除工作区 不同工作区的内容会分开储存到数据库 default工作区 test工作区 db_imp ...
- div可以滚动但不显示滚动条
首先有3个div, 第1个,固定大小是200*200(单位为px,下同) 第2个,不固定大小,其大小要用第3个div把个撑开,但是这个div必需要有滚动条, 第3个,固定大小与第1个div保持一致20 ...
- 赶紧收藏!这些Java中的流程控制知识你都不知道,你凭什么涨薪?
Java的流程控制 基础阶段 目录: 用户交互Scanner 顺序结构 选择结构 循环结构 break & continue 练习题 1.Scanner对象 之前我们学的基本语法中并没有实现程 ...
- selenium调用JS实现自动化
webdriver自带的api使用起来有局限性,比如下拉滚动条文本框输入,以及一些弹出框的操作,使用JS直接操作方便又灵活. 一:示例 from selenium import webdriver f ...
- C语言讲义——函数递归
函数直接或间接调用自身 每次调用必须获得一些进展,进一步靠近目标 达到目标就不再调用自身 阅读递归函数不要纠缠于执行过程,而是相信递归函数会顺利完成任务 例:阶乘 0! =1(0 的阶乘定为1) 1! ...
- redis 压测与乐观锁
单线程没有出现并发问题. 链接太多爆炸了 把连接改到50,没有问题 改回1000: emmm159,看来相当一部分拒绝了 并且8180-10000到头了 cpu爆炸了 观察下这种程度的并发用乐观锁 一 ...