Antwort ohne Aufruf?

  • Antwort ohne Aufruf?

    hallo Leute,

    ich habe ein kleines Browsergame, 99% in php/mysql und ein ganz klein wenig javascript

    es braucht keine schnelle action, auch ist die gesamtmenge an daten im spiel so klein, dass sie problemlos bei jedem seitenaufruf komplett neu geladen werden kann, darum reicht es dem spiel, wenn ganz simpel bei jedem mausklick php den gesamten datensatz liest, berechnet und das ergbnis als komplett neue html seite zurück gibt

    ein problem habe ich nur im multiplayer modus, wenn ein spieler auf den anderen warten muss, das habe ich derweil mit einem simplen META refresh gelöst, der einfach alle 10 sekunden die seite neu aufruft
    mit zunehmender anzahl spieler wird aber auch ein refresh alle 10 sekunden zum problem, sprich meinem provider geht die server last zu hoch

    rein theoretisch muss der wartende spieler seine seite nicht ständig refreshen, sondern nur dann, wenn er wirklich dran ist im spiel, aber da hören meine kenntnisse auf, falls es überhaupt machbar ist

    ich stelle mir vor, dass der server den browser vom client kontaktiert, wenn dieser im spiel dran ist, ohne dass der client dazu seine seite refreshen muss
    aber wie könnte das gehen?
    ich gehe davon aus, dass es in php nicht geht, aber es wäre mir egal in welcher sprache (mal abgesehen davon dass ich ausser php nicht viel kann), bis hin zu separat laufenden P2P verbindungen, soll mir alles recht sein, wenn mir nur einer sagen kann wie?

    danke im voraus
    Thomas
  • meta refreshs.. ihh *gg*
    für was gibts denn Ajax :D

    Hier wird zwar der Inhalt auch alle 2 Sekunden neu geladen.
    Aber wenn keine neuen Nachrichten vorliegen, wird halt nur eine leere Seite geladen.

    hab mal auf die Schnelle einen Wiki Beitrag dazu erstellt: [coderwiki]HowTos/Ajax-Server-zu-Client-Kommunikation[/coderwiki]

    Hier der Code:

    Quellcode

    1. <html><head>
    2. <title>Server zu Client Kommunikation</title>
    3. <script type="text/javascript">
    4. <!--
    5. function ajax()
    6. {
    7. try {
    8. req = window.XMLHttpRequest?new XMLHttpRequest():
    9. new ActiveXObject("Microsoft.XMLHTTP");
    10. } catch (e) {
    11. //Kein AJAX Support
    12. }
    13. req.onreadystatechange = function() {
    14. if ((req.readyState == 4) && (req.status == 200)) {
    15. var feedback = req.responseText;
    16. //Liegen neue Nachrichten vor, dann gebe diese aus
    17. if(feedback == "") {
    18. document.getElementById("status").innerHTML = "Es liegen keine Aenderungen vor";
    19. document.getElementById("status").style.backgroundColor = '#ffaaaa';
    20. } else {
    21. document.getElementById("status").innerHTML = "Aenderungen geladen";
    22. document.getElementById("status").style.backgroundColor = '#aaffaa';
    23. document.getElementById("message").innerHTML = feedback;
    24. }
    25. //Rekursiv jede Sekunde aufrufen und auf Statusaenderung reagieren
    26. setTimeout("ajax()", 5000);
    27. }
    28. }
    29. req.open('get', 'status.php');
    30. req.send(null);
    31. }
    32. //-->
    33. </script>
    34. </head>
    35. <body onload="ajax()">
    36. <div id="status"></div>
    37. <p />Letzte Nachricht:
    38. <div id="message" style="background-color:#bfbfbf"></div>
    39. <p />status.php muss anhand der Authentifizierung (IP Adresse oder Cookie) prüfen,
    40. ob für den Client eine ungelesene Nachricht vorliegt. Falls ja, wird diese zurück gegeben,
    41. falls nein, erhält der Benutzer eine leere Seite (wenig Traffic).
    42. <p />Wird die neuste Nachricht geladen, muss der Server nach erfolgreicher Übertragung den Status natürlich ändern und darf nichts mehr zurückgeben.
    43. </body>
    44. </html>
    Alles anzeigen
  • erstmal danke für die antwort,
    ist aber im prinzip das gleiche was ich auch mache, nur 5 mal öfter
    traffic ist nicht das problem, auch meine lösung braucht nur wenig traffic bei refresh ohne änderung, da gibts einfach nur ein "bitte warten"
    auch in deiner lösung muss der client beim server "nachfragen" ob änderungen vorliegen, was den server rechenzeit kostet und genau das wollte ich verhindern (falls es denn machbar ist)

    mal angenommen ich habe 2 spieler, der eine hat seinen zug beendet und muss nun warten, bis der andere spieler ebenfalls fertig wird
    theoretisch hat der server vom ersten spieler alle nötigen daten um ihn zu kontaktieren, auch ohne dass der client seine seite refresht, es müsste also reichen in den klick auf "fertig" bei spieler 2 die benachrichtigung an spieler 1 einzubauen, dass er jetzt wieder dran ist, entweder wenn der server die änderungen aus dem zug von spieler 2 in die datenbank schreibt, oder aber von spieler 2 zu spieler 1 direkt, die frage ist nur wie, mein latein reicht da bei weitem nicht, innerhalb vom browser vermutlich gar nicht möglich
  • "ThomasG" schrieb:

    Es müsste also reichen in den klick auf "fertig" bei spieler 2 die benachrichtigung an spieler 1 einzubauen, dass er jetzt wieder dran ist


    ohne eine anwendung auf seiten des clients, die auf irgendwelche kommunikationsversuche vom server reagiert, kannst du das nicht realisieren.
    Dann bräuchte diese Clientanwendung noch einen Port und die Daten müssten durch Router und Firewall.

    Nene.. mit einer reinen Browseranwendung ist eine "echte" Server zu Client Kommunikation nicht möglich.

    So ein paar AJAX Requests kosten aber auch nicht die Welt.
    Hast du selbst die Möglichkeit die Serverauslastung zu überprüfen?