# Server-Sent Events (oder andere Möglichkeit vom Server aus Client an zu sprechen)



## jeipack (2. Mai 2011)

Hi
Ich habe mir Server-Sent Events angeschaut und bringe es leider nicht zum laufen. Hier mal mein Code:

```
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>myEventListener</title>
<script type="text/javascript">
   document.getElementsByTagName("eventsource")[0].addEventListener("server-time", eventHandler, false);
   function eventHandler(event)
   {
       // Alert time sent by the server
       document.getElementById('ticker').innerHTML = event.data;

   }
</script>
</head>
<body>
<div id="sse">
   <eventsource src="myEventsWriter.jsp" />
</div>
<div id="ticker" name="ticker">
   [TIME]
</div>
</body>
</html>
```

sowie Serverseitig die myEventsWriter.jsp:

```
<%@page language="java" contentType="text/event-stream; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" %>
<%
int i=0;
while(i++<2) {
	out.println("Event: server-time");
	out.println("Data: "+new java.util.Date());
	out.println("");
Thread.sleep(2000);
}%>
```

Der Output dieser Datei ist dann folgender:

```
Event: server-time
Data: Mon May 02 17:48:52 CEST 2011

Event: server-time
Data: Mon May 02 17:48:54 CEST 2011
```

Das ganze habe ich dem obigen Link entnommen und führe es unter Chrome 11 aus (Unter Firefox und IE ist das noch nicht implementiert). Serverseitig ists ein Tomcat 6. Trotzdem tut sich nichts! Kann mir jemand dabei helfen dies zum laufen zu bringen?



Oder wie der Titel schon sagt, kennt jemand eine andere Möglichkeit vom Server aus den Client an zu sprechen? Stichwort Web-Socket, HTTP Push oder ein XMLHttpRequest das offen bleibt und man Serverseitig immer wieder was reinschreiben kann (Wobei man dann im JavaScript irgendwie darauf reagieren können sollte).

Am besten natürlich was, was in den *aktuellen* Browern funktioniert (Auf Abwärtskompatibilität setzt ich bei dem jetzt keinen Wert).


Was ich genau machen will ist vom Server aus Attribute an eine JavaScript Funktion zu übergeben ohne dass ich vorher genau weiss wann sich diese Attribute ändern. (Die einfache Alternative wäre dann wohl einfach immer wieder ein HttpRequest zu stellen und die Attribute neu Abfragen. Auch hier eine Frage, wie stark dürfte ich diese Schleife takten? Würden 500milisec gehen?)

Grüsse und vielen Dank für eure Hilfe und Ideen
jeipack


----------



## jeipack (2. Mai 2011)

Hier noch eine kleine Linkliste:
http://molily.de/weblog/javascript-zukunft-2010  <-- nach: "Echtzeit-Datenübertragung: Welche Technik setzt sich durch?" suchen

Server Sent Events:
http://dev.w3.org/html5/eventsource/
http://www.javalobby.org/java/forums/t105057.html


----------



## CPoly (2. Mai 2011)

Dann werfe ich auch mal Links in den Raum.

http://socket.io/
http://beaconpush.com/

Zu deinem konkreten Problem kann ich leider nichts sagen.


----------



## jeipack (3. Mai 2011)

hi
Also danke für den socketIO Link. Sieht ganz interessant aus, auch wenn ich es nocht nicht durchblicke.

Von http://howtonode.org/websockets-socketio
"Socket.IO is a lightweight API that runs on the browser and looks like this:"

```
var socket = new io.Socket();
socket.on('connect', function(){
    // connected!
});
socket.on('message', function(msg){
    // message coming
});
socket.send('Hello world!');
```

Was ich noch gar nicht kapiere. Muss dann der User http://socket.io/ erst Herunterladen damit dass dann bei ihm funktioniert? Das wäre ein absolutes NoGo
Hoffe heut Nachmittag finde ich Zeit das genauer an zu schauen. Weiss auch noch nicht wie ich das installieren soll. Scheint alles für Linux zu sein:
Zum Installieren:
"npm install socket.io"
Zum npm installieren:
"curl http://npmjs.org/install.sh | sh"

Also wenn damit schon mal jemand was gemacht hat an paar Infos und nem Beispiel wär ich brennend interessiert 

greez


----------



## CPoly (3. Mai 2011)

jeipack hat gesagt.:


> Muss dann der User http://socket.io/ erst Herunterladen damit dass dann bei ihm funktioniert?



Streng genommen ja. Aber das passiert ja automatisch, weil du den JavaScript Code per

```
<script src="http://{node_server_url}/socket.io/socket.io.js"></script>
```
einbindest. Also bekommt der Nutzer davon nichts mit, wie bei jeder anderen JavaScript/CSS/Bilddatei. Den Client musst du nicht "installieren", sondern nur die JavaScript Datei ausliefern.



jeipack hat gesagt.:


> Weiss auch noch nicht wie ich das installieren soll. Scheint alles für Linux zu sein:
> Zum Installieren:
> "npm install socket.io"
> Zum npm installieren:
> "curl http://npmjs.org/install.sh | sh"




Du musst hier zwischen Client und Server differenzieren. Das was du dort gepostet hast ist die Installation des *Server*-Plugins für *NodeJS*. NodeJS hat mit Socket.IO aber erst mal überhaupt nichts zu tun. NodeJS läuft aber tatsächlich nur auf Linux (zumindest sind die Windows Ports nicht für produktiven Einsatz), aber das spielt ja keine Rolle. In deinem Fall käme dann eher eine andere Server-Implementierung in Frage, z.B. http://code.google.com/p/socketio-java/
Ich hab bisher nur mit NodeJS gearbeitet, aber clientseitig spielt das ja keine Rolle. Das ganze ist wirklich extrem einfach zu bedienen. Innerhalb von *Minuten* hat man z.B. einen rudimentären Chat gebaut.


----------



## jeipack (3. Mai 2011)

Ok jetzt kapier ich schon ein ganzes Stück mehr. Hab vielleicht bisschen übereilt geposted.
Vielen dank für den googlecode link. Denke damit komm ich jetzt ein rechtes Stück weiter 

Hier noch ein paar weitere Links (für mich, dich und jeden der mal in dieses Topic schaut)
download Socket.io.js:
https://github.com/LearnBoost/Socket.IO/downloads

Einfaches Chatbeispiel (Mit NodeJS):
https://github.com/devinsba/nodejs-simplechat


NodeJS schaut schon recht einfach aus. Auch wenn ich im obigen Chat-Beispiel z.B. noch nicht verstehe wie er mit "socket.broadcast(data); " gleich die Daten an alle Teilnehmer schickt.

Muss ich mir echt anschauen und schauen ob man mit NodeJS auch auf ne Datenbank connecten kann und was sonst möglich ist, vielleicht steig ich doch noch auf NodeJS um..


----------



## CPoly (3. Mai 2011)

NodeJS kann sehr viel. Ist natürlich was für JavaScript Fanboys wie mich, die am liebsten nichts anderes mehr programmieren wollen :-D

Datenbank ist kein Problem (hab selbst schon mit MySql gearbeitet). Viele C/C++ Bibliotheken sind in NodeJS verfügbar und via JavaScript ansprechbar.

Hier eine Liste von Modulen für NodeJS (ist schon ne ganze Menge :-D) https://github.com/joyent/node/wiki/modules


----------



## dtm (7. Mai 2011)

Hallo

ich habe einen Windows-Server (IP xxx.xx.xx.xx) der auf Port 5000 horcht

Der Server sendet an alle angemeldeten Clients (kleines Win-Programm) in unregelmässigem Takt (1-10) Sekunden Daten

das Ganze soll nun im Browser laufen und ein ein bis zwei Zeilen dargestellt werden.

Wie kann das mit html/php/Js gelöst werden


----------



## jeipack (8. Mai 2011)

@dtm: Mit WebSockets.
Ich habe es jetzt mit socket.IO und Node.JS als Server gemacht.
Hier mal der Clientteil:

```
<!DOCTYPE html>
<head>
        <title>BasicSocket.IO</title>
</head>
<body>
        <div id="textbox"></div>
        <script type="text/javascript"  src="socket-io/socket.io.js"></script>
        
        <script>
        var oldData = [];
        // Connect to your server and assign the result to a variable
        var socket = new io.Socket('localhost', {port: 80});

        socket.connect();
        socket.on('connect', function(client){
                oldData+='connected<br>';
				document.getElementById('textbox').innerHTML = oldData;
        });

        socket.on('message', function(data){
                // Do some stuff when you get a message
                oldData += data;
                document.getElementById('textbox').innerHTML = oldData;
        });

        socket.on('disconnect', function(){
                oldData+='disconnected<br>';
				document.getElementById('textbox').innerHTML = oldData;
        }); 
        </script>
</body>
</head>
```
Ob du damit jetzt einfach auf dein Programm zugreifen kannst weiss ich nicht, da ich es jetzt gleich mit Node.JS als Server mache.
Wäre dann die Zeile:
var socket = new io.Socket('xxx.xxx.xxx.xxx', {port: 5000});


----------



## dtm (8. Mai 2011)

Hi
ich sehe zwar, dass sich der Client am Server anmeldet, aber es kommt nix zuück
was mache ich da falsch?
muss da noch mehr auf den Webhost oder muss die htm auch auf dem Server liegen?

Ich habe "leider" einen Windows-Server. Da kann ich das NodeJS nicht installieren oder?


----------



## jeipack (8. Mai 2011)

Hi
Hast du Socket.IO also gedownloaded und beim Client eingebunden? 
Hast du den Client genau so übernommen wie ichs hier geposted habe? Wenn du connectest klappt dann dieser Teil:

```
socket.connect();
        socket.on('connect', function(client){
                oldData+='connected<br>';
				document.getElementById('textbox').innerHTML = oldData;
        });
```

Und wenn du Daten sendest (Am besten mit Umbruch und flash, damit die Daten auch sicher gesendet wurden) klappt dann dieser Teil hier nicht?

```
socket.on('message', function(data){
                // Do some stuff when you get a message
                oldData += data;
                document.getElementById('textbox').innerHTML = oldData;
        });
```


Ich hab auch Windows und lasse NodeJS einfach ber cygwin laufen. Klappt einwandfrei.
cygwin ist eine Linuxumgebung für Windows.


----------



## dtm (8. Mai 2011)

Hi

bei
https://github.com/LearnBoost/Socket.IO/downloads

habe ich die ZIP heruntergeladen und 1:1 auf den Webhost gepackt (das Learnbostverz in sockit-io umbenannt)

eingebunden habe ichs so wie Du'S beschrieben hast

kann es sein dass ich in der socket.io.js was anpassen muss, weil es ja auf einen Windows-Server (winsock) zugreifen soll

schon bei "connect" kommt nix
ich seh nur am Winsock, dass Daten geschickt werden
oder muss der Server eine Bestimmte Meldung zurück schicken?

auf dem Server kommt immer was von
policy-file-request/
was bedeutet das?


----------



## rollerueckwaerts (13. März 2012)

Server Sent Events ist auf jeden Fall Mist. Statt Echtzeit ist das einfach nur eine Anfrage vom Client zum Server die alle 3 Sekunden stattfindet. Warum das "Server Sent" heißt ist mir ein Rätsel. Bin enttäuscht 

Werde es dann mal mit Sockets versuchen


----------

