Go SSE Demo

package main

import (
	"fmt"
	"github.com/r3labs/sse/v2"
	"gopkg.in/antage/eventsource.v1"
	"log"
	"net/http"
	"sync"
	"time"
)

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

	http.Handle("/", http.FileServer(http.Dir("./")))
	http.Handle("/events", es)
	go func() {

		for {
			// 每2秒发送一条当前时间消息,并打印对应客户端数量
			es.SendEventMessage(fmt.Sprintf("hello, now is: %s", time.Now()), "", "")
			log.Printf("Hello has been sent (consumers: %d)", es.ConsumersCount())
			time.Sleep(2 * time.Second)
		}
		//log.Printf("ES Server Close")
		//es.Close()
	}()

	log.Println("Open URL http://127.0.0.1:9990/1.html in your browser.")
	err := http.ListenAndServe(":9990", nil)
	if err != nil {
		log.Fatal(err)
	}
}

func testClient() {
	client := sse.NewClient("http://127.0.0.1:9990/events")

	//proxyUrl, _ := url.Parse("http://127.0.0.1:9934")
	//client.Connection.Transport = &http.Transport{
	//	TLSClientConfig: &tls.Config{
	//		InsecureSkipVerify: true,
	//	},
	//	Proxy: http.ProxyURL(proxyUrl),
	//}
	fmt.Println("开始订阅")
	client.Subscribe("messages", func(msg *sse.Event) {
		// Got some data!
		v := string(msg.Data)
		fmt.Println("收到消息:" + v)
	})
}

func main() {
	wg := sync.WaitGroup{}
	wg.Add(1)

	go testServer()
	go testClient()

	wg.Wait()
}

html端 1.html

<!DOCTYPE html>
<html>
<head>
    <title>SSE test</title>
    <script type="text/javascript">
        window.addEventListener("DOMContentLoaded", function () {            
            var evsrc = new EventSource("http://127.0.0.1:9990/events");
            var msgEvent = function (ev) {                
                document.getElementById("log")
                    .insertAdjacentHTML("beforeend", "<li>" + ev.data + "</li>");
            }
			evsrc.onmessage = msgEvent;
			//evsrc.addEventListener("message", msgEvent)
            evsrc.onerror = function (ev) {
                console.log("readyState = " + ev.currentTarget.readyState);
            }
        })
    </script>
</head>
<body>
<h1>SSE test</h1>
<div>
    <ul id="log">
    </ul>
</div>
</body>
</html>

网页端效果

Golang中的SSE(Server-Sent Events)是一种服务器向客户端单向发送事件流的技术。它允许服务器实时地向客户端发送数据,而无需客户端发起请求。这对于实现实时通信或推送消息非常有用。在Golang中,您可以使用`net/http`包来实现SSE。 下面是一个简单的示例代码,演示如何在Golang中使用SSE: ```go package main import ( "fmt" "net/http" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 设置响应头,指定使用SSE w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("Access-Control-Allow-Origin", "*") // 循环发送事件数据 for i := 0; i < 10; i++ { // 通过写入响应流发送事件数据 fmt.Fprintf(w, "event: message\n") fmt.Fprintf(w, "data: This is message %d\n\n", i) // 刷新响应流,确保数据发送到客户端 w.(http.Flusher).Flush() time.Sleep(1 * time.Second) } }) http.ListenAndServe(":8080", nil) } ``` 在上述示例中,我们创建了一个HTTP服务器,并定义了一个处理函数来处理所有请求。在处理函数中,我们首先设置响应头,指定使用SSE。然后,我们进入一个循环,每隔1秒发送一个事件数据到客户端。使用`fmt.Fprintf`函数将事件数据写入响应流,通过`w.(http.Flusher).Flush()`来刷新响应,确保数据即时发送到客户端。 您可以运行上述代码,然后在浏览器中访问`http://localhost:8080`,您将看到10个事件从服务器实时地推送到客户端。 这只是一个简单的示例,您可以根据自己的需求进行扩展和定制。希望对您有所帮助!如果有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值