2010-12-07 7 views
9

Ich arbeite an einem POC zum Selbstlernen, in dem ich meinen Benutzer im LIVE-Muster verbunden halten möchte. Zum Beispiel, ein Spiel, in dem 4 Benutzer gleichzeitig spielen können, muss ich diesen Benutzer mit meinem Spiel verbunden halten.Was ist das beste Design/Möglichkeit, Benutzer verbunden zu halten?

M nicht gut bei Socket Art der Programmierung und liebe das in Services Art zu tun. Was ich Wana wissen ist, "Was ist der beste Weg, dies zu tun". Laut meinem ersten Brain Storming habe ich beschlossen, dass ich SilverLight (In Browser oder Out of Browser) als Frontend verwenden werde [ich habe kein Problem damit].

Ich bin mehr Sorge im Backend. Entweder mache ich einen Handler oder mache einen WCF-Dienst oder benutze den Vollduplex-Dienst und verwende einen Pooling-Mechanismus dafür. Als Zufalls Gedanke, den ich mit einem Timer-Typ-Logik kommen, dass jeder nach 10 Sekunden bei Kunden beenden und erhalten Status wie

  • Ist es nun wiederum zu rollen ein Würfel

  • Startseite viele Benutzer abfeuern links (im Fall, wenn links einige von ihnen)

  • Was Benutzerstatus in Spiel verbunden ist, wie es/sammelt Punkte ect und Update
    Spiel Ansicht nach dem an seinem Ende

Bitte geben Sie Ihre besten Antworten hier, die mir helfen werden, dies zu lernen.

Grüße und Dank im Voraus

EDIT:

Start Bounty, wie ich mehr Feedback benötigen.

FH

Antwort

11

Fasih,

Da HTTP staatenlos ist, können Sie nicht mehr als 2-Wege-Kommunikation aus dem Code machen. Aber es gibt einen Workaround, wenn Sie AJAX verwenden. Wie Sie gesagt haben, ist der Timer eine Einbahnstraße. Eine andere heißt COMET oder Reverse AJAX.

Dies simuliert die Zwei-Wege-Kommunikation, ohne auf Timer angewiesen zu sein. Um dies zu erreichen, müssen Sie lange laufende AJAX-Aufrufe an den Server ausführen, und der Aufruf wird nur zurückgegeben, wenn eine Aktualisierung vorgenommen wurde. Übernehmen Sie ein einfaches Web-Chat-Szenario. 2 Benutzer führen lange AJAX-Aufrufe an den Server aus, und beide rufen das allgemeine Medium ab (z. B. DB). Wenn der Benutzer1 Text sendet, wird er aktualisiert und der wartende AJAX-Aufruf von Benutzer2 übernimmt den Text und kehrt zurück. Und wieder werden beide Benutzer einen langen Anruf machen, um einander zuzuhören.

Da Sie bereits beschlossen haben, mit silverlight fortzufahren, können Sie WCF Duplex-Kanal verwenden, um die 2-Wege-Kommunikation zu emulieren. Wie ich bereits erwähnt habe, gehen Sie nicht mit Timer-Logik. Es ist nicht sofort, wenn Sie den Server für 10 Sekunden abfragen (alles kann in einem Spiel innerhalb von 10 Sekunden passieren), und es wird die Serverlast erhöhen, wenn Sie für jede Sekunde abfragen.

Vermeiden Sie daher die Timer-Logik und verwenden Sie lange laufende AJAX-Aufrufe.

Wenn Sie nach anderen Optionen als WCF-Duplex-Kanäle suchen, sind HTML5 web sockets und COMETs andere Wege zu gehen.

überprüfen Sie diese post für Browser, die Web-Socokets unterstützen.

+0

nette Antwort. Ich mag es. Daraus kann ich meinen eigenen Loon mit Ajax Calling Mechanismus machen. Lass mich das Ausprobieren . wird aktualisiert – Singleton

+0

Lesen Sie einfach Ihre Antwort jetzt .. besser als meins..Richtig, dass die Serverlast wird mehr sein, wenn Timer verwendet wird .. – Mahesh

+0

Buddy, sagte ich, ich lese gerade Ihre Antwort jetzt .. wenn ich es gelesen hätte, würde ich nicht habe mir die Mühe gemacht zu kommentieren, was ich getan habe und sagte, dass deine Antwort besser ist als meine .... nur aus Gründen der Höflichkeit. – Mahesh

1

Grundsätzlich geht es darum, Daten vom Server auf den Client zu übertragen. Also dachte ich, ist eine Abonnenten-Publisher-Architektur, Sie können eine Warteschlange (in einer db-Tabelle für ex) auf dem Server für jeden der Benutzer erstellen, die verbunden sind, und einen Ajax einen Webdienst aufrufen, der Daten aus der Tabelle ziehen wird .

Jede Nachricht sollte als Befehl für den Client encapuslated sein. Sie können also für jede Operation, für die der Client in der Lage ist, verschiedene Nachrichten verwenden. {Befehl: Anzeige, Text: „user bla bla angemeldet hat“} ein anderer Befehl aussehen könnte {Befehl: rolldice, Text: „die Würfel rollen“}

Lassen Sie mich wissen, was Sie denken ...