Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Server-sent events – En saa toimimaan

Sivun loppuun

HTML5 [26.07.2013 20:58:27]

#

Olen useasti yrittänyt saada toimimaan server-sent events -toimintoa nettisivuillani: [linkki poistettu].

Käytetty HTML- ja JavaScript-koodi:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>SSE-testi</title>
		<meta name="robots" content="noindex">
	</head>
	<body>
		<h1> Server-sent events </h1>

		<div id="result"></div>

		<script>
			if(typeof(EventSource) !== 'undefined') {
				var source = new EventSource('sse-lahetys');
				source.onmessage = function(event) {
					document.querySelector('#result').innerHTML += event.data + '<br>';
				};
			}
			else {
				document.querySelector('#result').innerHTML = 'Sorry, your browser does not support server-sent events.';
			}
		</script>

	</body>
</html>

Palvelimen puolen, tässä tapaukessa PHP-, koodi:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$time = date('r');
echo "data: Palvelimen aika on: ${time}\n\n";
flush();
?>

Ongelma on, että ”sse-lahetys”-tiedoston noutaminen epäonnistuu, Chromen kehittäjätyökalujen mukaan. Status-kohdassa lukee ”(canceled)” ja syynä tähän on ”(anonymous function @ sse-testi:9”.

Sama koodi (muutamaa pientä muutosta lukuunottamatta) toimii kuitenkin täällä: http://www.w3schools.com/html/tryit.asp?filename­=tryhtml5_sse.

Olen testannut koodia myös ilman noita kahta pientä muutosta, varmuuden vuoksi, vaikka niillä ei pitäisi olla vaikutusta koodin toimintaan. Tilanne ei muuttunut yhtään.

Osaatteko sanoa, mikä voisi olla syy tähän edellämaninittuun toimimattomuuteen?

Lisäys (21.41): Virheilmoitus näkyy siis Chromen Developer Toolsin Network-välilehdellä. Sivu täytyy päivittää, jotta virhe tulee näkyviin.

Metabolix [26.07.2013 22:18:15]

#

Kokeilin koodiasi omalla koneellani, ja se toimii aivan oikein. Ilmeisesti vika on siis palvelimesi asetuksissa. Firefoxin konsolin mukaan palvelimesi antaa sivulta sse-lahetys vastauksen ”406 Not Acceptable”. Komentorivillä wgetillä lataus onnistuu, mutta kun lisää otsikon ”Accept: text/event-stream”, tulee tuo 406-vastaus.

Hieman koomisesti Mozillan esimerkkisivulla on myös vastaava ongelma, tosin siellä syypää on välityspalvelin, joka palauttaa datan text/plain-tyyppisenä.

HTML5 [26.07.2013 22:48:58]

#

No, käännynpä siis palveluntarjoajan puoleen. Muistan ihmetelleeni joskus, miksi tuo ei toimi Mozillan sivuilla.
Kiitos!

HTML5 [29.07.2013 22:08:51]

#

Voisiko SSE:n korvata käyttämällä Ajax-tekniikkaa?
Käyttäessäni Chromen kehitystyökaluja näyttää, että selain hakee tietyin väliajoin tietyn tiedoston. Sama onnistuu helposti ajaxilla.

Onko se yhtä hyvä vaihtoehto kuin SSE. Ainakin ajaxin selaintuki on parempi ja se toimii käyttämälläni palvelimella.

The Alchemist [29.07.2013 23:03:49]

#

Perinteinen ajax on bloattia verrattuna sse:hen. Toki se toimii ihan hyvin maltillisella viestittelyn määrällä ja jos viive viestin lähettämisen ja vastaanottamisen välillä saa olla suuri. Sinun pitää itse tutkia ja päättää, onko perinteinen ajax sopiva tai edes mahdollinen vaihtoehto siihen systeemiin, mitä olet rakentamassa.

Metabolix [02.08.2013 22:49:25]

#

Jos Ajax olisi yhtä hyvä kuin SSE, SSE:tä ei varmaan olisi edes keksitty. SSE:n selvä etu Ajaxiin nähden on, että yhden pitkäkestoisen HTTP-pyynnön aikana voidaan välittää useita viestejä, kun taas Ajaxissa yhteen pyyntöön saadaan lähtökohtaisesti vain yksi vastaus (paitsi eräillä epäluotettavilla kikkailuilla). Jos siis palvelimen pitää lähettää dataa vaikka joka sekunti, SSE:llä riittää yksi pitkäkestoinen pyyntö mutta Ajaxilla täytyy tehdä joka sekunti uusi pyyntö. SSE:llä siis vähennetään palvelimen kuormaa huomattavasti. Toisaalta kannattaa miettiä, onko jatkuva tiedon päivittäminen tarpeen vai voisiko sen tehdä vaikka vain muutaman minuutin välein.

HTML5 [04.08.2013 20:29:47]

#

Metabolix kirjoitti:

Jos Ajax olisi yhtä hyvä kuin SSE, SSE:tä ei varmaan olisi edes keksitty. SSE:n selvä etu Ajaxiin nähden on, että yhden pitkäkestoisen HTTP-pyynnön aikana voidaan välittää useita viestejä, kun taas Ajaxissa yhteen pyyntöön saadaan lähtökohtaisesti vain yksi vastaus (paitsi eräillä epäluotettavilla kikkailuilla). Jos siis palvelimen pitää lähettää dataa vaikka joka sekunti, SSE:llä riittää yksi pitkäkestoinen pyyntö mutta Ajaxilla täytyy tehdä joka sekunti uusi pyyntö. SSE:llä siis vähennetään palvelimen kuormaa huomattavasti. Toisaalta kannattaa miettiä, onko jatkuva tiedon päivittäminen tarpeen vai voisiko sen tehdä vaikka vain muutaman minuutin välein.

Kiitos! Tuo selvensi asiaa paljon.

HTML5 [05.08.2013 15:54:22]

#

Sain koko homman toimimaan lisäämällä .htaccess-tiedostoon seuraavan:

<Files sse-lahetys.php>
    AddType text/event-stream .php
</Files>

Ennen jostain syystä php:ssä määritetty mime-tyyppi text/event-stream muuttui muotoon text/html ja palvelin palautti http-tilan 406, kun sivupyynnön mukana lähetettiin otsikko Accept: text/event-stream. Muuten mime-tyyppi ja http-tila olivat oikein.

Nyt palvelin palauttaa tilan 200, niin kuin pitääkin ja mime-tyyppikin on oikea – myös Accept-headerin kanssa. Sse toimii loistavasti.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta