消息服务器 推送技术,SSE服务器推送技术

SSE即 server send event 服务器发送事件,在在早期可能会使用ajax向服务器轮询的方式,使浏览器第一时间接受到服务器的消息,但这种频率不好控制,消耗也比较大。

但是对于SSE来说,当客户端向服务端发送请求,服务端会抓住这个请求不放,等到有数据时才返回给客户端,但客户端手动消息后,再向服务器发送请求,周而复始。这种方式好处是减少了服务器的请求数量,也大大减少了服务器的压力。

以下是第一种方式的代码的演示,浏览器不断向服务器请求,服务器用线程睡眠5s再返回结果。

1、SseController 控制器

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Random;

/**

* @description: 服务器端推送控制器

*

* @author: Shenshuaihu

* @version: 1.0

* @data: 2019-06-25 23:29

*/

@Controller

public class SseController {

/**

* 输出类型 text/event-stream 是对服务器端SSE的支持

* 此处每5s向浏览器推送随机消息

* @return

*/

@RequestMapping(value = "/push", produces = "text/event-stream")

public @ResponseBody String push() {

Random random = new Random();

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "data:Testing 1,2,3: " + random.nextInt() + "\n\n";

}

}

2、显示结果的页面 sse.jsp

SSE-Code

sse.jsp

服务器推送 可以用于消息订阅

解决长短轮询不是解决问题

server send event 当客户端方服务器发送请求时 服务器抓住不放 等有数据时 再回复给客户端,客户端收到消息时发给送给服务器,如此循环

参考内容:

https://www.jianshu.com/p/bc5a9b4a1cd1

console.log("!!Window EventSource: " + !!Window.EventSource)

if (!!window.EventSource) {

var source = new EventSource('push');

s = '';

source.addEventListener('message', function (evt) {

s += evt.data + "
";

$("#msgFromPush").html(s);

});

source.addEventListener('open', function (evt) {

console.log("连接打开.")

})

// 添加SSE客户端监听,获取服务端推送的消息

source.addEventListener('error', function (evt) {

if (evt.readyState == EventSource.CLOSED) {

console.log("连接关闭.")

} else {

console.log(evt.readyState)

}

}, false);

} else {

console.log("你的浏览器不支持SSE.")

}

/*if(window.EventSource){

var eventSource = new EventSource("http://localhost:8080/push");

//只要和服务器连接,就会触发open事件

eventSource.addEventListener("open",function(){

console.log("和服务器建立连接");

});

//处理服务器响应报文中的load事件

eventSource.addEventListener("load",function(e){

console.log("服务器发送给客户端的数据为:" + e.data);

});

//如果服务器响应报文中没有指明事件,默认触发message事件

eventSource.addEventListener("message",function(e){

console.log("服务器发送给客户端的数据为:" + e.data);

});

//发生错误,则会触发error事件

eventSource.addEventListener("error",function(e){

console.log("服务器发送给客户端的数据为:" + e.data);

});

}

else{

console.log("服务器不支持EvenSource对象");

}*/

显示的结果

b73d5faea350

SSE-.png

二、使用Servlet 3.0 + 异步方法处理,第二种方式演示,浏览器循环请求服务端,服务端用定时任务,每5S设置一下数据,返回给浏览器

1、开启异步方法的支持 WebInitializer.java

import org.springframework.web.WebApplicationInitializer;

import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletRegistration.Dynamic;

/**

* @description: Web配置 代替web.xml

* @author: Shenshuaihu

* @version: 1.0

* @data: 2019-06-13 23:22

*/

public class WebInitializer implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext servletContext) throws ServletException {

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

context.register(MyMvcConfig.class);

// 新建的webApplicationContext ,注册配置类,并将其和当前servletContext关联。

context.setServletContext(servletContext);

// 注册SpringMVC 的 DispatcherServlet

Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));

servlet.addMapping("/");

servlet.setLoadOnStartup(1);

// 开启对异步的支持

servlet.setAsyncSupported(true);

}

}

2、AsyncController.java 控制层,只用掉service

import com.ch4.service.PushService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.context.request.async.DeferredResult;

/**

* @description:

*

* @author: Shenshuaihu

* @version: 1.0

* @data: 2019-06-27 08:32

*/

@Controller

public class AsyncController {

@Autowired

private PushService pushService;

@RequestMapping("/defer")

@ResponseBody

public DeferredResult deferredCall() {

return pushService.getAsyncUpdate();

}

}

3、PushService.java

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Service;

import org.springframework.web.context.request.async.DeferredResult;

/**

* @description: SSE 定时任务

* 在PushService里面产生 DeferredResult 给控制器使用,

* 通过 @Scheduled 定时更新DeferredResult

*

* @author: Shenshuaihu

* @version: 1.0

* @data: 2019-06-27 08:32

*/

@Service

public class PushService {

private DeferredResult deferredResult;

public DeferredResult getAsyncUpdate() {

deferredResult = new DeferredResult();

return deferredResult;

}

@Scheduled(fixedDelay = 5000)

public void refresh() {

if (deferredResult != null) {

deferredResult.setResult(new Long(System.currentTimeMillis()).toString());

}

}

}

3、数据页面async.jsp

pageEncoding="UTF-8"%>

async support-Code

defer.jsp

deferred();

function deferred() {

$.get('defer', function (data) {

console.log(data);

s = '';

s += data + "
";

$('#defer').html(s)

// 完成后在向服务器请求

deferred();

}

);

}

4、需要在核销配置类用开启任务

@Configuration

@EnableWebMvc

@ComponentScan("com.ch4")

@EnableScheduling

public class MyMvcConfig extends WebMvcConfigurerAdapter {}

b73d5faea350

SSE-aync.png

总结:

SSE用于订阅消息,是需要浏览器不断的请求,与websocket有相似之处

2019/06/30晚于成都

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...

wifi密码被别人改了怎么办?wifi密码之所以被别人修改,是因为其他人知道了你路由器的登录密码。所以,如果发现自己wifi密码被别人修改了,应该立刻登录到路由器设置界面,修改路由器登录密码、修改wifi密码、并调整wifi加…

CentOS7 Firewall NAT 及端口映射

本节介绍用CentOS7的Firewalll来做NAT以及端口映射实验拓扑:因为我的环境里CentOS7上有KVM虚拟机需要共享网卡上网,所以我把网卡都添加到了桥里面,当然这里也可以不用桥,直接用物理网口;用nmcli创建桥,并添加网口到桥&…

JVM源码---教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看)

LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试。尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇到不少意料之外的错误。 为了方便各位猿友编译,LZ临时…

另一个域的cookie_一定要知道的第一方Cookie和第三方Cookie

Cookie 是您访问过的网站创建的文件,用于存储浏览信息,例如您的网站偏好设置或个人资料信息。共有两种类型的 Cookie:第一方 Cookie 是由地址栏中列出的网站域设置的 Cookie,而第三方 Cookie 来自在网页上嵌入广告或图片等项的其他…

苹果手机怎么连接不了无线网络连接服务器,苹果手机连接wifi显示无互联网连接怎么办?...

在开始对网络操作以后,也可尝试着把 iPhone 重新启动一下,按下 iPhone 电源键不放,直到出现关机选项并滑动关机,最后再开机。在 iPhone 的无线局域网列表中,当前连接的这个无线网络显示“无互联网连接”。此时可以通过…

git学习心得之从远程仓库克隆

现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库: $ git clone gitgithub.com:michaelliao/gitskills.git Cloning into gitskills... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) R…

2018-2019 20165208 网络对抗 Exp3 免杀原理与实践

目录 2018-2019 20165208 网络对抗 Exp3 免杀原理与实践实验内容基础问题回答实践过程记录任务一:正确使用免杀工具或技巧任务二:通过组合应用各种技术实现恶意代码免杀任务三:用另一电脑实测,在杀软开启的情况下,可运…

k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系

一、人工智能人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。实际应用比如:机器视觉,指纹识别,人脸识别,视网膜识别,虹膜识…

软件系统换服务器地址,天正软件客户端修改服务器地址

天正软件客户端修改服务器地址 内容精选换一换如果IP经过NAT/WAF,则只能获取到NAT/WAF转化后的IP地址,无法获取到NAT/WAF前的IP地址。如果客户端为容器,只能获取到容器所在主机的IP地址,无法获取容器的IP。四层监听器(TCP/UDP)开启…

选中下拉列表显示全部数据_小白都能学会的多级下拉列表,让你的Excel效率提升百倍...

私信回复关键词【工具】,获取Excel高效小工具合集!让你的Excel效率开挂~你有没有遇到过这样的场景?收集上来的各部门工作进度表,里面的答案五花八门。即使在表头上进行提示规范,手动输入也十分低效。有没有什么办法能够…

lightgbm 数据不平衡_不平衡数据下的机器学习(下)

本文从不平衡学习的基础概念和问题定义出发,介绍了几类常见的不平衡学习算法和部分研究成果。总体来说,不平衡学习是一个很广阔的研究领域,但受笔者能力和篇幅的限制,本文仅对其中部分内容做了简单概述,有兴趣深入学习…

netty实现高性能文件服务器,通用文件服务组件(Netty实现版本)

本文所述文件服务组件在笔者此前一篇文章中已有阐述(基于netty的文件上传下载组件),不过本文将基于之前这个实现再次进行升级改造,利用基于注解的方式进行自动装配。1. 简介1.1 Netty简介Netty是一个异步事件驱动的网络应用程序框架,用于快速…

PHP 小数点保留两位【转】

最近在做统计这一块内容&#xff0c;接触关于数字的数据比较多&#xff0c; 用到了三个函数来是 数字保留小数后 N 位&#xff1b; 接下来简单的介绍一下三个函数&#xff1a; 1、number_format echo number_format("5000000")."<br>"; echo number_…

华为杯数学建模2020获奖名单_我校在2020年全国大学生数学建模竞赛中再获佳绩(内附获奖名单)...

# 近日&#xff0c;从全国大学生数学建模竞赛组委会获悉&#xff0c;我校在2020年全国大学生数学建模竞赛中获得5项国家二等奖。国家奖获奖数量在全国农林院校中并列排名第二。在黑龙江省高校中位居第三名。1你的喜悦&#xff0c;我们的欣慰# 2020年全国大学生数学建模竞赛于9月…

fn映射 mac 键盘_【新鲜评测】高颜值、低延迟、多模式跨平台办公神器-米物蓝牙键盘...

首先&#xff0c;要例行感谢糖纸众测&#xff0c;感谢麻麻酱给我这次评测机会。大家可以微信搜索【糖纸】小程序免费体验更多科技产品。小米旗下生态链公司米物最近出了一款蓝牙双模键盘&#xff0c;它作为一个85全键键盘&#xff0c;可以完成蓝牙和USB转换&#xff0c;以及PC和…

小程序 input 换行_小程序 input双向数据绑定

小程序 双向绑定数据&#xff08;单个&#xff09;<小程序 双向绑定数据&#xff08;多个&#xff09;<

Suricata的初始化脚本

见官网 https://suricata.readthedocs.io/en/latest/initscripts.html

jpa在自己创建表的是字段名不一致_用 数据透视表 完成 Excel多表合并

一般情况下&#xff0c;数据透视表只能汇总一个表格中的数据。即使使用多区域汇总&#xff0c;也只能对多表的单列内容进行数据汇总&#xff0c;而多列却无法实现。前段时间也推送过Power Query的方法&#xff0c;但它有版本限制。而今天宏兴会计培训小编推送的是一个通用的多表…

使用栈实现队列 Implement Queue using Stacks

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of queue.pop() -- Removes the element from in front of queue.peek() -- Get the front…

550什么意思_研报翻译官第二期:带你了解什么是CPI

欢迎收看“第二期”研报翻译官&#xff0c;临近年末&#xff0c;各类金融研报接踵而至&#xff0c;我们也常会看到GDP、CPI、PPI这类字眼。过年回家跟亲戚朋友唠嗑的时候&#xff0c;如果不扯上几句CPI或PPI&#xff0c;都显自己得不够专业。听你们吹牛&#xff0c;我炒菜都有劲…