From 0fc2968e9542b233f930bd13339ae0bad72333aa Mon Sep 17 00:00:00 2001 From: miya Date: Thu, 29 May 2025 15:59:09 +0800 Subject: [PATCH] feat: add new example: sse --- sse/handler/handler.go | 35 +++++++++++++++++++++++++++++++++++ sse/main.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 sse/handler/handler.go create mode 100644 sse/main.go diff --git a/sse/handler/handler.go b/sse/handler/handler.go new file mode 100644 index 0000000..26dfef1 --- /dev/null +++ b/sse/handler/handler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "log" + "net/http" + "time" +) + +func SSEHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/event-stream") + + flusher, ok := w.(http.Flusher) + if !ok { + http.Error(w, "Streaming unsupported!", http.StatusInternalServerError) + return + } + + notify := r.Context().Done() + + for { + select { + case <-notify: + log.Println("Client disconnected") + return + default: + event := "data: " + time.Now().Format(time.RFC3339) + "\n\n" + if _, err := w.Write([]byte(event)); err != nil { + log.Println("Write error:", err) + return + } + flusher.Flush() + time.Sleep(1 * time.Second) + } + } +} diff --git a/sse/main.go b/sse/main.go new file mode 100644 index 0000000..95f89c8 --- /dev/null +++ b/sse/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "log" + + "github.com/go-kratos/examples/sse/handler" + "github.com/go-kratos/kratos/v2" + "github.com/go-kratos/kratos/v2/transport/http" + "github.com/gorilla/mux" +) + +func main() { + router := mux.NewRouter() + router.HandleFunc("/sse", handler.SSEHandler) + + httpSrv := http.NewServer(http.Address(":8080"), http.Timeout(0)) + httpSrv.HandlePrefix("/", router) + + app := kratos.New( + kratos.Name("sse"), + kratos.Server( + httpSrv, + ), + ) + + log.Println("Open http://127.0.0.1:8080/sse in your web browser") + if err := app.Run(); err != nil { + log.Println(err) + } +}