Golang使用SSE(EventSource)

EventSource 是 HTML5 中一个强大的 API,提供了简单可靠的服务器推送机制,用于实现实时通信。
与 WebSocket 相比,EventSource 的优势在于其简单易用、自动重连、轻量级和跨域支持。
然而,它也有一些限制,如单向通信和较低的浏览器支持。
相比之下,WebSocket 适用于双向通信、大规模应用和实时性要求较高的场景。

go

package main

import (
	"fmt"
	"gopkg.in/antage/eventsource.v1"
	"log"
	"net/http"
	"time"
)

func main() {
	es := eventsource.New(nil, nil)
	defer es.Close()

	http.Handle("/", http.FileServer(http.Dir("./")))
	http.Handle("/events", es)
	go func() {
		for {
			// 每2秒发送一条当前时间消息,并打印对应客户端数量
			//自定义event,例如拼接上用户id,可以给用户单独推送
			es.SendEventMessage(fmt.Sprintf("hello, 现在的时间是: %s", time.Now()), "abc", "")
			//默认的event是message是可以不写的
			//es.SendEventMessage(fmt.Sprintf("hello, 现在的时间是: %s", time.Now()), "", "")
			log.Printf("在线人数: %d", es.ConsumersCount())
			time.Sleep(2 * time.Second)
		}
	}()

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal(err)
	}
}

html

<!DOCTYPE html>
<html>
<head>
    <title>SSE test</title>
    <script type="text/javascript">
        window.addEventListener("DOMContentLoaded", function () {
            var evsrc = new EventSource("http://localhost:8080/events");
            var msgEvent = function (ev) {
                document.getElementById("log")
                    .insertAdjacentHTML("beforeend", "<li>" + ev.data + "</li>");
            }
            var msgEvent2 = function (ev) {
                document.getElementById("log")
                    .insertAdjacentHTML("beforeend", "<li>" + ev.data + "-event-abc" + "</li>");
            }
            //evsrc.onmessage = msgEvent;
            //evsrc.addEventListener("message", msgEvent) //默认就是message,也可以自定义event
            evsrc.addEventListener("abc", msgEvent2)
            evsrc.onerror = function (ev) {
                console.log("readyState = " + ev.currentTarget.readyState);
            }
        })
    </script>
</head>
<body>
<h1>SSE测试</h1>
<div>
    <ul id="log">
    </ul>
</div>
</body>
</html>

效果


posted @   朝阳1  阅读(681)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示