server-sent event后台用.net怎样实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了server-sent event后台用.net怎样实现相关的知识,希望对你有一定的参考价值。

参考技术A html5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端。(通常叫数据推送)。我们来看下,传统的WEB应用程序通信时的简单时序图:

sse1

现在Web App中,大都有Ajax,是这样子:

sse2

基于数据推送是这样的,当数据源有新数据,它马上发送到客户端,不需要等待客户端请求。这些新数据可能是最新闻,最新股票行情,来自朋友的聊天信息,天气预报等。

sse3

数据拉与推的功能是一样的,用户拿到新数据。但数据推送有一些优势。 你可能听说过Comet, Ajax推送, 反向Ajax, HTTP流,WebSockets与SSE是不同的技术。可能最大的优势是低延迟。SSE用于web应用程序刷新数据,不需要用户做任何动作。
你可能听说过HTML5的WebSockets,也能推送数据到客户端。WebSockets是实现服务端更加复杂的技术,但它是真的全双工socket, 服务端能推送数据到客户端,客户端也能推送数据回服务端。SSE工作于存在HTTP/HTTPS协议,支持代理服务器与认证技术。SSE是文本协议你能轻易的调试它。如果你需要发送大部二进制数据从服务端到客户端,WebSocket是更好的选择。

让我们来看一下很简单示例,先是前端basic_sse.html:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Basic SSE Example</title>
</head>
<body>
<pre id="x">Initializing...</pre>
<script>
var es = new EventSource("basic_sse.php");
es.addEventListener("message", function(e)
document.getElementById("x").innerHTML += "\n" + e.data;
,false);
</script>
</body>
</html>
后端先是一个basic_sse.php页面:

<?php
header("Content-Type: text/event-stream");
while(true)
echo "data:".date("Y-m-d H:i:s")."\n\n";
@ob_flush();@flush();
sleep(1);

?>
您可以使用Apache Server 这里我们把它们放在SinaAppEngine上,浏览器FireFox访问basic_see.html时,将继续返回当前时间:

sse4
代码中数据格式是data: datetime. 在这儿,我们还可以使用Node.js来做服务端,datepush.js代码是这样的:

var http = require("http");
http.createServer(function(request, response)
response.writeHead(200, "Content-Type": "text/event-stream" );
setInterval(function()
var content = "data:" +
new Date().toISOString() + "\n\n";
response.write(content);
, 1000);
).listen(1234);
完善一下功能,如果我们用Node.js来返回HTML,代码是这样的datepush.js:

var http = require("http"), fs = require("fs");
var port = parseInt( process.argv[2] || 1234 );
http.createServer(function(request, response)
console.log("Client connected:" + request.url);
if(request.url!="/sse")
fs.readFile("basic_sse.html", function(err,file)
response.writeHead(200, 'Content-Type': 'text/html' );
var s = file.toString(); //file is a buffer
s = s.replace("basic_sse.php","sse");
response.end(s);
);
return;

//Below is to handle SSE request. It never returns.
response.writeHead(200, "Content-Type": "text/event-stream" );
var timer = setInterval(function()
var content = "data:" + new Date().toISOString() + "\n\n";
var b = response.write(content);
if(!b)console.log("Data got queued in memory (content=" + content + ")");
else console.log("Flushed! (content=" + content + ")");
,1000);
request.connection.on("close", function()
response.end();
clearInterval(timer);
console.log("Client closed connection. Aborting.");
);
).listen(port);
console.log("Server running at http://localhost:" + port);本回答被提问者和网友采纳
参考技术B

servet-set详解

WebFlux系列 Server-Sent Events

#编程#入门#java#spring#webflux#SSE#reactor#

SSE和Websocket区别

视频讲解: https://www.bilibili.com/video/av82133200/

WebfluxServerApplication.java
package com.example.webfluxserver;

import lombok.extern.log4j.Log4j2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.Duration;

@Log4j2
@SpringBootApplication
public class WebfluxServerApplication extends BaseApplication{
    public static void main(String[] args) { SpringApplication.run(WebfluxServerApplication.class, args); }
    @RestController
    class EmployeeController{

        @GetMapping(value = "sse",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
        public Flux<String> sse1(){
            return Flux.interval(Duration.ofMillis(1000)).map(val ->val.toString());
        }
    }
}

公众号,坚持每天3分钟视频学习

以上是关于server-sent event后台用.net怎样实现的主要内容,如果未能解决你的问题,请参考以下文章

Web Worker 和 Server-Sent Events

Comet 现在是不是已经过时了 Server-Sent Events 和 WebSocket? [关闭]

逐句回答,流式返回,ChatGPT采用的Server-sent events后端实时推送协议Python3.10实现,基于Tornado6.1

Server-sent Events

WebFlux系列 Server-Sent Events

WebFlux系列Server-Sent Events(续)