AJAX und Client-Server-Architektur mit JavaScript

8

Ich muss Webseiten programmieren, aber ich mag die statische HTML-Natur eher nicht. Ich bevorzuge eher eine Client-Server-Architektur.

Nun habe ich festgestellt, dass Sie mit XMLhttp grundsätzlich Ihre Seite dynamisch aktualisieren und Informationen / Aktionen an einen / von einem Server senden / anfordern können. Dies würde also grundsätzlich den Kundenbereich abdecken.

Aber um eine Client-Server-Architektur zu vervollständigen, muss der Server auch Informationen senden / anfordern, ohne abgefragt zu werden.

Gibt es eine Möglichkeit, beispielsweise für einen Chatserver, eine empfangene Nachricht an alle Clients zurückzusenden (die Clients benutzen einen Webbrowser), ohne dass die Clients in einem festen Intervall abfragen müssen? Ich möchte implementieren, dass man sehen kann, während Sie etwas eingeben.

    
Stefan Steiger 15.01.2010, 18:47
quelle

5 Antworten

13

Es gibt verschiedene Möglichkeiten, dies zu erreichen. Einige von ihnen sind bereits hier beantwortet, aber ich wollte ein paar mehr sowie meine Gedanken zu ihnen hinzufügen.

1. Polling

Häufige Anfragen werden an den Server gestellt, um nach neuen Informationen zu suchen. Dies ist der schlechteste Weg, dies zu tun, aber wahrscheinlich der einfachste. Wenn Ihre Website nur eine geringe Anzahl an Benutzern aufweist, ist es möglicherweise sinnvoll, dies zu tun.

Dies kann erreicht werden, indem setInterval(myFunction, n) in JavaScript verwendet wird, um XMLHttpRequests an den Server zu senden, und zwar alle n Millisekunden. Auf dem Server antworten Sie dann mit Ihren neuen Informationen, wenn Sie sie haben, oder mit einer Nachricht, die keine neuen Informationen enthält.

2. Langes Polling

Wenn die Seite geladen ist, fordert sie den Server nach neuen Informationen an. Der Server hält die Verbindung offen, bis etwas zurückgeschickt werden kann. Diese Methode reduziert den verwendeten Netzwerkverkehr, erhöht jedoch die auf dem Server verwendeten Ressourcen. Sie können dies für eine kleine Anzahl von Benutzern verwenden, aber es skaliert nicht sehr gut.

Am einfachsten ist es, wenn die Seite, die die AJAX-Anfrage bearbeitet, einfach auf neue Informationen wartet und dann antwortet. Dies kann viele Verbindungen auf Ihrem Server binden. Also, mit Vorsicht verwenden.

3. COMET

COMET ist im Grunde lange Abfragen, aber der Server ist richtig eingerichtet es. Es weiß, dass diese Verbindungen nicht "real" sind und verwendet weniger Ressourcen, um sie zu handhaben. Dies ist eine großartige Lösung für dieses Problem, aber es erfordert, dass der Server explizit für diesen Zweck eingerichtet wird. Es gibt COMET-Server und COMET-Addins für andere populäre Server, aber es wird etwas Setup und manchmal etwas Geld erfordern.

Die Implementierung auf .NET ist nicht die einfachste Sache der Welt. Sie können für Lösungen bezahlen, versuchen, den Code von jemand anderem zu finden, der etwas Ähnliches macht, oder versuchen, es selbst zu schreiben. Ich habe dafür keine anständigen kostenlosen Lösungen gefunden. Wenn jemand anderes hat, bitte Kommentar.

4. RIA

Eine andere Lösung wäre, Flash, Silverlight oder Java Applet auf Ihrer Seite einzubinden. Menschen tun dies oft, indem sie ein 1x1-Objekt verwenden, so dass sie Flash oder Silverlight verwenden können, um mit dem Server zu sprechen. Wenn es Ihnen nichts ausmacht, die Abhängigkeit hinzuzufügen, ist dies eine vernünftige Lösung. Wenn Sie Silverlight oder Flash bereits kennen, könnte es relativ einfach zu implementieren sein.

Sie können Anleitungen für jede dieser Optionen im Internet finden.

5. Web Sockets

Wenn Sie auf dem neuesten Stand sind, können Sie sich Web Sockets ansehen. Es ist nur in den neuesten Versionen moderner Browser verfügbar. Es war Teil von HTML5, aber es könnte jetzt eine eigene Spezifikation sein. Unabhängig davon bedeutet dies, dass ältere Browser nicht in der Lage sind, damit umzugehen. Aber wenn es Ihnen nichts ausmacht, sich auf die neuesten Browser zu beschränken, können Sie diese erstaunliche Funktion nutzen.

Ich glaube, dass Chromium der einzige Browser ist, der unterstützt es derzeit. Es wird jedoch daran gearbeitet, dies in Firefox und WebKit zu implementieren.

Ich werde Ihnen die Kontroverse ersparen und einfach sagen, dass dies genau das tut, was Sie wollen. Die Zusammenfassung der Spezifikation sagt alles.

  

Diese Spezifikation definiert eine API, mit der Webseiten das Web Sockets-Protokoll für die bidirektionale Kommunikation mit einem Remote-Host verwenden können.

Besondere Erwähnung

Wenn Sie sich für die Welt von Node JS interessieren, können Sie mit Socket IO nichts falsch machen. Es wird das Beste aus der Technologie implementiert, die dem Browser zur Verfügung steht.

Fazit

Die beste Option ist Socket.IO auf Knoten JS. Wählen Sie jedoch für eine ASP.Net-Lösung COMET oder Web Sockets. Ansonsten ist die Verwendung von Flash / Silverlight nicht schlecht. Schließlich sollten Umfragen und lange Umfragen letzte Ressorts sein. Sie können immer eines davon unterstützen und dann auf ein anderes zurückgreifen, wenn es im Browser des Clients keine Unterstützung dafür gibt.

    
EndangeredMassa 15.01.2010, 19:28
quelle
2

Ja, Sie können COMET verwenden.

    
RedFilter 15.01.2010 18:51
quelle
1

Der Client muss dem Server mitteilen, wenn der Clientbenutzer mit der Eingabe beginnt. Sie haben hier ein paar Optionen.

  1. Häufige Anfragen vom Server für die letzte Aktivität. Dies würde für jeden Benutzer stattfinden, der am Chat beteiligt ist. Die gleiche Anfrage könnte auch verwendet werden, um benutzerspezifische Aktivitäten an den Server zu senden: "Jonathan tippt ..."

  2. Langes Polling. Dies fordert im Wesentlichen Informationen vom Server an, und der Server hält die Verbindung geöffnet, bis etwas zurückgeschickt wird. So sind Ihre Anfragen minimiert, aber Ihre Verbindungen bleiben länger geöffnet.

Abhängig von Ihrem Datenverkehr, der Art der zu übertragenden Daten, der Serverumgebung und vielen anderen Faktoren kann eine dieser Optionen mehr glänzen als die andere.

    
Sampson 15.01.2010 18:52
quelle
0

Sie können Silverlight für Push-Benachrichtigungen verwenden. Sehen Sie sich PollingDuplexHttpBinding an. Da Sie ASP.Net MVC verwenden, hinzufügen Silverlight wird einfach sein.

Sehen Sie sich diese Seite für weitere Informationen.

    
Gabriel McAdams 15.01.2010 19:02
quelle
0

Basierend auf der REST Architektur, auf der das HTML-System basiert, soll die Serverrolle einfach als Ressource für der Klient, um davon zu ziehen. Ich verallgemeinere, aber es gibt Tools, um diese Art von Aktion auf der Client-Seite statt auf der Server-Seite zu implementieren.

Sie schreiben besser / verwenden eine Bibliothek, die regelmäßig Updates vom Server anfordern kann. Sie können diese Anfragetypen in einem JavaScript-Objekt kapseln, das Ereignisse auslösen kann. Auf diese Weise kann Ihr clientseitiges Skript so funktionieren, als ob es vom Server benachrichtigt wird. Überprüfen Sie einige allgemeine Sachen mit COMET Sie können wahrscheinlich einige Tools finden, die Ihnen beim clientseitigen Code helfen.

HTML 5 hat einige vorläufige Versuche mit dieser Art von Funktionalität, aber wenn Sie möchten, dass Ihre App auf älteren Browsern funktioniert, sollten Sie stabilere Methoden verwenden, wie AJAX, die Updates angefordert haben.

    
Nathan Tregillus 15.01.2010 19:13
quelle