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.
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ä.
No, käännynpä siis palveluntarjoajan puoleen. Muistan ihmetelleeni joskus, miksi tuo ei toimi Mozillan sivuilla.
Kiitos!
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.
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.
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.