From 0b860df1c7813c67ad96322b6fdc95b61ea05bbc Mon Sep 17 00:00:00 2001 From: yangzhao Date: Wed, 31 Jul 2024 22:00:55 +0800 Subject: [PATCH] best method for SSE --- example/server_sse.cc | 59 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 example/server_sse.cc diff --git a/example/server_sse.cc b/example/server_sse.cc new file mode 100644 index 0000000..0581306 --- /dev/null +++ b/example/server_sse.cc @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include + +#define HTTP_SERVER_PORT 1234 + +using namespace std; + +map sseEmitterMap; + +int main(int argc, char *argv[]) { + + httplib::Server svr; + svr.set_default_headers({ + {"Access-Control-Allow-Origin", "*"}, + {"Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS,PATCH, DELETE"}, + {"Access-Control-Max-Age", "3600"}, + {"Access-Control-Allow-Headers", "*"}, + }); + + svr.Options(R"(/.+)", [](const auto &req, auto &res) { + res.set_header("Allow", "GET, POST, HEAD,PATCH, OPTIONS"); + }); + + svr.Get("/sse", [](const httplib::Request &req, httplib::Response &res) { + string data = "event: log\nid: 0\ndata: sse test\nretry: 3000\n\n\n"; + res.set_content(data, "text/event-stream; charset=UTF-8"); + httplib::detail::SseEmitter sseEmitter(req.sock_fd); + sseEmitterMap[req.sock_fd] = sseEmitter; + }); + thread t([] { + int id = 1; + while (true) { + this_thread::sleep_for(chrono::seconds(1)); + if (sseEmitterMap.size() < 1) { continue; } + cout << "send event: " << id << std::endl; + vector clearSocktFds; + for (auto sseEmitter : sseEmitterMap) { + sseEmitter.second.id = id; + sseEmitter.second.event = "message"; + sseEmitter.second.data = "test ==> " + to_string(id); + if (sseEmitter.second.send() == -1) { + clearSocktFds.push_back(sseEmitter.first); + } + } + for (auto k : clearSocktFds) { + sseEmitterMap.erase(k); + } + id++; + } + }); + t.detach(); + svr.listen("0.0.0.0", HTTP_SERVER_PORT); + return 0; +}