Я пытаюсь «передавать» данные на страницу HTML5, используя события, отправленные сервером.
Это руководство http://www.html5rocks.com/en/tutorials/eventsource/basics/ был очень полезен для работы на стороне клиента.
Но на стороне сервера я делаю что-то похожее на пример HTTPServer в http://pocoproject.org/slides/200-Network.pdf
Учебник html5rocks.com дал мне следующую идею для кода обработчика запросов:
void MyRequestHandler::handleRequest (HTTPServerRequest &req, HTTPServerResponse &resp)
{
resp.setStatus(HTTPResponse::HTTP_OK);
resp.add("Content-Type", "text/event-stream");
resp.add("Cache-Control", "no-cache");
ostream& out = resp.send();
while (out.good())
{
out << "data: " << "some data" << "\n\n";
out.flush();
Poco::Thread::sleep(500)
}
}
и источник страницы HTML5:
<!DOCTYPE html>
<html>
<head>
<title>HTLM5Application</title>
</head>
<body>
<p id="demo">hello</p>
<script>
var msgCounter = 0;
var source;
var data;
if(typeof(EventSource) !== "undefined")
{
source = new EventSource('/stream');
document.getElementById("demo").innerHTML = "Event source created";
}
else
{
document.getElementById("demo").innerHTML = "Are you using IE ?";
}
source.addEventListener('message', function(e)
{
msgCounter++;
document.getElementById("demo").innerHTML = "Message received (" + msgCounter + ") !<br/>"+ e.data;
}, false);
</script>
</body>
</html>
Хорошо то, что при открытии html-страницы данные передаются в потоковом режиме, и я получаю правильный вывод (текст между тегами обновляется, как и ожидалось.
Проблема в том, что когда я закрываю страницу в браузере, программа POCO вылетает, а в консоли получаю следующее сообщение:
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Process returned 3 (0x3) execution time : 22.234 s
Press any key to continue.
(Я использую Code::Blocks, поэтому отображается возвращаемое значение и время выполнения)
Событие, когда я помещаю цикл while() между try{ }catch(...){}, программа все равно падает без входа в catch (то же самое происходит, когда я помещаю все содержимое main() между try/catch )
Основная программа содержит только эти инструкции:
int main(int argc, char* argv[])
{
MyServerApp myServer;
myServer.run(argc, argv);
return 0;
}
Я хочу знать, что могло вызвать этот сбой и как я могу это исправить, пожалуйста.
Заранее спасибо за вашу помощь :)