关于js实现SSE的简单实践

本文介绍了如何使用Go作为服务器端,JavaScript作为客户端来实现Server-Sent Events(SSE)。SSE是一种简单的服务器向浏览器推送实时更新的技术,虽然HTML5兼容性有限,但其便利性不容忽视。在实践中,服务器端Go代码需要设置特定的HTTP头,并以"data:"开头的数据发送时间戳;而JavaScript通过EventSource对象接收并处理这些事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      看了服务器推送,了解除了服务器轮询和websocket外还有一样东西叫做SSE(Server Send Event),非常好用而且简单。不过是个HTML5才支持的方法,兼容性方面打了折扣。不过的确是一种比较实用的技术。

      直接贴代码,服务器用go,网上很多是用php的,对php不愿学的飘过...

      有些坑先说说:

1、服务器端返回的内容一定要“data:”开头,api要求这样也没有什么好说的。

2、返回内容最后要两个换行 "\n\n"或者"\r\n\r\n"。如果不加换行也接收不了消息。

服务器go代码:

package main
import (
"net/http"
"log"
"fmt"
"time"
)
func jsonResponseHandler(w http.ResponseWriter,r *http.Request){
w.Header().Set("Access-Control-Allow-Origin", "*")//允许访问所有域
    w.Header().Add(`Access-Control-Allow-Headers`,`Content-Type`)//header的类型
    w.Header().Set(`Content-Type`,`text/event-stream;charset=utf-8`)//返回数据格式是json 
w.Header().Set("Cache-Control","max-age=0")
//w.Header().Set(`Transfer-Encoding`,`identity`)
fmt.Fprintf(w,"data:"+time.Now().Format("2006-01-02 15:04:05")+"\n\n")
fmt.Println("data:"+time.Now().Format("2006-01-02 15:04:05"))

}
func main() {
http.HandleFunc("/",jsonResponseHandler)
err := http.ListenAndServe(":9091",nil)
 
if err!=nil{
log.Fatal("ListenAndServe:",err)
}
}


js代码:

var source;

function init(argument){

source = new EventSource("http://172.17.9.225:9091")

source.onopen =function(e){

console.log("连接已经建立:",this.readyState );

//document.getElementById("datadiv").innerText += "连接已经建立:" + this.readyState +"\n";

};

source.onmessage =function(event){

console.log("服务器数据:",event.data)

document.getElementById("datadiv").innerText+= "服务器数据:" + event.data + "\n";

};

source.onerror =function(err){

};

}

init();


html 页面代码:

<!DOCTYPE html>

<html>

<head>

<metacharset="utf-8" />

<title></title>

</head>

<body>

<div id="datadiv">

</div>

</body>

<script src="js/index.js" type="text/javascript" charset="utf-8"></script>

</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值