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

jeipack

Erfahrenes Mitglied
Hi
Ich habe mir Server-Sent Events angeschaut und bringe es leider nicht zum laufen. Hier mal mein Code:
HTML:
<!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:
HTML:
<%@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:
Code:
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
 
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:"
Javascript:
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
 
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
HTML:
<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.

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.
 
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..:)
 
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
 
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
 
@dtm: Mit WebSockets.
Ich habe es jetzt mit socket.IO und Node.JS als Server gemacht.
Hier mal der Clientteil:
HTML:
<!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});
 
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?
 

Neue Beiträge

Zurück