# Websockets | HTML5



## piir (24. Jan 2012)

Hallo, ich stehe gerade vor einem Problem.
Ich würde mich gerne weiterbilden und Websockets programmieren.
Im Internet finde ich meistens nur Englische Tutorials, da mein Englisch nicht das beste ist bitte ich hier um Hilfe.

Also am besten würde ich das ganze Thema zuerst Ausarbeiten.
Vor und Nachteile (kein long-polling usw...)
Wie es funktioniert, Beispiele usw.

Nun stoße ich auf ein Problem, wie löse ich das mit Tomcat als Server?
Habe noch nie Tomcat benutzt, und wollte fragen ob es möglich ist.

Danke im Voraus .


----------



## schalentier (24. Jan 2012)

Tomcat kann das imho out-of-the-box nicht. Ich empfehle node.js. Das ist ein Webserver, den man mit Javascript programmiert. Der kann auch Websockets und das super einfach:

```
var webSocket = socketIO.listen(httpServer);
webSocket.on('connection', function(client) {
    client.send('Please enter a user name ...');

    var userName;
    client.on('message', function(message) {
        if(!userName) {
            userName = message;
            webSocket.broadcast(message + ' has entered the zone.');
            return;
        }

        var broadcastMessage = userName + ': ' + message;
        webSocket.broadcast(broadcastMessage);
    });

    client.on('disconnect', function() {
        var broadcastMessage = userName + ' has left the zone.';
        webSocket.broadcast(broadcastMessage);
    });
});
```

Fehlt noch das entsprechende HTML5:

```
<html>
    <head>
        <title>Simple chat o' rama</title>
    </head>
    <body>
        <div>
            <p>
                <label for="messageText">Message</label>
                <input type="text" id="messageText"/>
            </p>
            <p>
                <button id="sendButton">Send</button>
            </p>
        </div>
        <div>
            <ul id="messages">
            </ul>
        </div>
        <script type="text/javascript"
                src="http://localhost:2000/socket.io.js"></script>
        <script type="text/javascript"
                src="http://code.jquery.com/jquery-1.5.2.js"></script>

        <script type="text/javascript">
            $(document).ready(function() {
                var webSocket = new io.Socket('localhost', { port: 2000 });
                webSocket.connect();

                webSocket.on('connect', function() {
                    $('#messages').append('<li>Connected to the server.</li>');
                });

                webSocket.on('message', function(message) {
                    $('#messages').append('<li>' + message + '</li>');
                });

                webSocket.on('disconnect', function() {
                    $('#messages').append('<li>Disconnected from the server.</li>');
                });

                $('#sendButton').bind('click', function() {
                    var message = $('#messageText').val();
                    webSocket.send(message);
                    $('#messageText').val('');
                });
            });
        </script>
    </body>
</html>
```

Link: Elegant Code  Taking Baby Steps with Node.js &ndash; WebSockets

PS: Lern Englisch!


----------



## Kr0e (24. Jan 2012)

Netty3 kann das auch.... Vermutlcih noch viele weitere Frameworks. Ich meine GlassFish kann das auch..

Vorteile von Websockets sind fast unbeschränkt... Echtzeit!


----------



## piir (24. Jan 2012)

Danke für die schnelle Hilfe.

Ich muss über dieses Thema referieren, und unser Professor hat da ziemlich strikte Kriterien die ich erfüllen sollte. Diese sehen wie folgt aus:



Inhalt (Definitionen, Vor-Nachteile, Vergleich zu anderen Sprachen)
Verständlichkeit
Aufbau (Ziele oder Problematik, Resümee)
Beispiele (1 Hello World, 1 Praxisrelevantes)
Umfang (max 6 Seiten)

und jetzt ist mir eben noch unklar wie ich das auf 6 Seiten packen soll D

Jedenfalls danke, super Forum


----------



## Lumaraf (25. Jan 2012)

Leider unterstützen viele Proxys noch keine Websockets. Das Problem kann man aber zum Glück leicht umgehen indem man die Verbindung via SSL einfach verschlüsselt. Ansonsten gibt es bei Websockets noch das Problem das aktuelle keine sinnvolle Komprimierung der Verbindung im Protokoll vorgesehen ist. Solange man keine großen Datenpackete vom Server zum Client über Websockets verschickt sind die aber so gut wie immer eine gute Wahl.


----------



## irgendjemand2 (25. Jan 2012)

Lumaraf hat gesagt.:


> Das Problem kann man aber zum Glück leicht umgehen indem man die Verbindung via SSL einfach verschlüsselt.



sorry wenn ich so dumm frage ... aber das bringt bitte WAS ?
wenn der proxy kein SOCKS bzw HTTP CONNECT unterstützt ... dann wird er auch bei ner SSL verbindung *wobei du hier wohl sicher HTTPS meinst ... da alles andere auch wieder SOCKS bräuchte* irgendwann mit nem timeout die verbindung trennen ...

ansonsten : sorry für die vermutlich dumme frage ... aber : könntest du mir dann bitte mal erklären wie SSL da helfen soll ?


----------



## Lumaraf (25. Jan 2012)

HTTPS ist nur HTTP kombiniert mit SSL. Da HTTPS zum Glück von sehr vielen Proxys unterstützt wird und es vor allem nie über transparente Proxys umgeleitet wird kann man da super die Websockets drin verstecken.


----------



## tuxedo (25. Jan 2012)

Lumaraf hat gesagt.:


> Ansonsten gibt es bei Websockets noch das Problem das aktuelle keine sinnvolle Komprimierung der Verbindung im Protokoll vorgesehen ist.



Kann dir nicht folgen. Websockets ermöglichen doch nur Socketverbindungen welche mittels HTTP vermittelt werden...
Die damit aufgebaute Socketverbindung hat kein eigenes Protokoll. Es ist doch dem Nutzer/Entwickler überlassen ein Protokoll darüber zu fahren, welches komprimierung beherrscht (oedr auch nicht)?!



Lumaraf hat gesagt.:


> Solange man keine großen Datenpackete vom Server zum Client über Websockets verschickt sind die aber so gut wie immer eine gute Wahl.



?? Ob ich nun viel oder wenig Daten schicke ist dem Websocket doch egal.. Sehe bzgl. der Übertragung keinen Unterschied zu "normalen Sockets".

- Alex


----------



## Lumaraf (25. Jan 2012)

tuxedo hat gesagt.:


> Kann dir nicht folgen. Websockets ermöglichen doch nur Socketverbindungen welche mittels HTTP vermittelt werden...
> Die damit aufgebaute Socketverbindung hat kein eigenes Protokoll. Es ist doch dem Nutzer/Entwickler überlassen ein Protokoll darüber zu fahren, welches komprimierung beherrscht (oedr auch nicht)?!
> 
> 
> ...



Websockets starten erstmal als gewöhnlicher HTTP-Request in dem an den Headern erkennen kann ob ein Upgrade auf eine Websocket Verbindung erwünscht ist. Insofern der Server die Upgradeanfrage akzeptiert wird dann auf das Websocket Protokoll umgeschaltet in dem in beiden Richtungen die Datenpackete in Websocket-Frames verpackt werden. Unter draft-ietf-hybi-thewebsocketprotocol-17 - The WebSocket Protocol steht wie die Datenpackete in den aktuelleren Protokollversionen aussehen. (Bei früheren Websocket-Versionen sehen die Datenpackete etwas anders aus)


----------



## tuxedo (25. Jan 2012)

Naj schön, gleiches gibts bei "TCP Sockets" ja auch. Und da "beschwert" sich auch keiner dass die darunterliegenden Frames nicht komprimiert sind..

Gut, ich muss zugeben, ich hab mit Websockets noch nichts realisiert, aber ich kann mir nicht vorstellen dass der Overhead dermaßen groß ist dass man da nix was über ein paar kilobytes drüber hinaus geht übertragen kann. 

Hat jemand mal Zahlen hierfür?


----------



## Lumaraf (25. Jan 2012)

Bei gewöhnlichen HTTP-Requests kann man die Daten die vom Server einfach gzip komprimiert schicken und der Browser kümmert sich um das enpacken. Mit Websockets geht das nicht da zum einen momentan nur UTF-8 Strings von den Browsern verstanden werden und zum anderen müßte man dann den Algorithmus zum entpacken in Javascript implementieren.


----------



## tuxedo (25. Jan 2012)

Das leuchtet ein. Aber man kann ja Websockets auch als "Tunnel" für andere Anwendungszwecke benutzen, und nicht einfach nur zwischen Browser und Webserver Strings bidirektional austauschen...


----------



## javateil (26. Jan 2012)

Hallo,
es sollte doch möglich sein pywebsockets auf tomcat einzuspielen oder?
dann würde doch tomcat auch websockets unterstützen?


----------



## Evil-Devil (26. Jan 2012)

Imho sollte man Websockets nicht primär als zur Datenübertragung nutzen. Anwendungen ala Chats ok, aber aktuell würde ich die Hauptanwendung darin sehen den Browser/User über Statusveränderungen in Kenntnis zu setzen. Zb. bei einem Ajax Upload und ähnlichen Dinge sodass der Browser dann einen HTTP Request absetzt und die eigentlichen Daten anfordern kann.


----------



## TheDarkRose (26. Jan 2012)

Ich sehe den Vorteil von Websockets darin, das nicht dauernd der Browser pollen muss, sondern der Client per Push vom Server über Änderungen benachrichtigt wird. Mit Websockets wird HTTP endlich "Statefull".


----------

