服务器端事件C ++实现?

时间:2018-08-21 12:49:06

标签: c++ server-side eventsource cpprest-sdk

我正在尝试实现C ++服务器来为javascript EventSource生成事件,我正在使用cpprest构建它。从我在PHP或Node.js中看到的示例来看,它看起来很简单,但是由于我在Firefox控制台中找到了它,因此我必须缺少一些东西:

Firefox can’t establish a connection to the server at http://localhost:32123/data.

有了邮递员,我正确地收到了"data : test",所以我想我错过了一些续传,可能需要做的不仅仅是回复请求,而是我没有找到很好的解释这应该还可以。如果您有一些文档可以指出,那将不胜感激!

html页面脚本如下:

var source = new EventSource("http://localhost:32123/data");

source.onmessage = function (event) {
    document.getElementById("result1").innerHTML += event.data + "<br>";
};

C ++服务器响应:

wResponse.set_status_code(status_codes::OK);
wResponse.headers().add(U("Access-Control-Allow-Origin"), U("*"));
wResponse.set_body(U("data: test"));
iRequest.reply(wResponse);

服务器收到的请求:

GET /data HTTP/1.1
Accept: text/event-stream
Accept-Encoding: gzip, deflate
Accept-Language: en-us, en;q=0.5
Cache-Control: no-cache
Connection: keep-alive
Host: localhost:32123
Origin: null
Pragma: no-cache
User-Agent: Mozilla/5.0 (Windows NT6.1; Win64, x64; rv:61.0) Gecko/20100101 Firefox/61.0

1 个答案:

答案 0 :(得分:1)

Found a solution here

这是一个小例子。它一点都不完美,但是可以正常工作。下一步是弄清楚如何存储连接,检查它们是否还活着,等等。

编辑:在达伦发表评论后更新答案

正确的解决方案似乎围绕着馈给绑定到设置为producer_consumer_buffer<char>的{​​{1}}的{​​{1}}。

然后,basic_istream<uint8_t>完成后,连接将保持打开状态,直到关闭缓冲区为止,这可以通过http_response完成。

我不确定100%,但似乎http_request::reply的行为类似于PHP wBuffer.close(std::ios_base::out).wait();命令,将在类似的事件提供服务器方案中使用。

下面添加了一个工作示例。

显然,这不是一个完整的解决方案。管理连接和所有连接还有更多乐趣。用wBuffer.sync().wait();实例化一些flush并将它们存储到事件中访问的容器中可能是我的选择...

main.cpp

Connection

sse.htm

make_unique