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) + } +}