Programowanie RMSBG na Facebooka cz. 3 – komunikacja klient – serwer

Jak klient w JS może komunikować się z serwerem w PHP przez HTTP?

W poprzednich częściach omówiłem rozwiązania klienckie i serwerowe dla gier RMSBG (Realtime Multiplayer Social Brower Games) na Facebooka. Omówiliśmy też jakie języki programowania są potrzebne.

Założmy na potrzeby dalszych rozważań, że zdecydowaliśmy się na w miarę wydajny serwer w postaci jakiegoś hostingu z jakimś Apachem i obsługą PHP i bazą MySQL oraz, że stronę kliencką będziemy pisać w JS.

Tutaj pojawia się pytanie. Jak strona kliencka będzie się komunikować z serwerem?

Jednym z rozwijanych projektów jest WebSockets, ale nadal nie jest on wystarczająco dobrze wspierany, ustandaryzowany i udokumentowany, żeby używać go w produkcji.

Jeśli chodzi o JS to komunikacja z serwerem może odbywać się obecnie głównie przez HTTP.

Ale to nie takie proste. HTTP nie zostało wymyślone do komunikacji dwukierunkowej. HTTP zostało wymyślone do pobierania danych o stronie internetowej, czyli m.in. HTMLu.

Więc użycie JS do komunikacji z serwerem po HTTP jest w pewnym sensie nadużyciem tego protokołu. WebSockets ma to zmienić, ale na razie jest jak jest.

Na czym polega komunikacja po HTTP z serwerem? W skrócie gdy otwierasz stronę przeglądarka wysyła zapytanie do serwera WWW prosząc o określoną podstronę. Serwer WWW szuka tej podstrony i odsyła do przeglądarki. Przeglądarka bierze to co dostała. Jeśli to jest HTML to go parsuje i wyświetla. Tak wyglądały statyczne strony internetowe 20 lat temu.

Później powstał język PHP i strony przestały być statyczne. Teraz gdy przeglądarka pyta się o określoną podstronę, PHP po stronie serwera odbiera żądanie, ustala co powinien zwrócić, jeśli trzeba to sięga do bazy danych MySQL i generuje w locie kod HTML strony odsyłając go do przeglądarki. Z punktu widzenia użytkownika nic się nie zmienia. Z punktu widzenia developerów mnóstwo. Ponieważ w PHP można oprogramować wyświetlanie różnych treści w zależności od żądania i innych czynników np. każdemu użytkownikowi wyświetlać treści dla niego przeznaczone.

Czytaj podobne  Gadu Gadu ma połowę Naszej Klasy, a Facebook stoi w miejscu

Jakie to ma znaczenie dla nas? Otóż jakby tak móc przez HTTP wysłać dane do serwera i poinformować PHP, że są to dane gry, to PHP po stronie serwera mogłoby odpowiednio zareagować np. zrozumieć, że tekst który wysłałeś to komunikat, który został napisany na czacie, PHP na serwerze by to zrozumiało i przekazało do innych graczy informację o nowym tekście na czacie do wyświetlenia.

No więc właśnie w JS to jest możliwe. Dopóki komunikujesz się z tym samym serwerem możesz do niego wysyłać zapytania przez HTTP. Nie trzeba w tym celu przeładowywać strony. Kod JS robi to w tle w sposób niewidoczny dla użytkownika.

Problem pojawia się jednak z komunikacją w drugą stronę. Serwer PHP ma informację, że jeden z graczy napisał coś na czacie i ma informację co napisał. Jak przekazać innym graczom tę informację, aby ich kod JS mógł wyświetlić im ten komunikat? Serwer PHP nie może wysłać wiadomości do graczy ponieważ HTTP służy tylko do odpytywania serwera. Tylko gracze mogą pytać się serwer o różne rzeczy. A gdyby tak się pytali o to, czy są jakieś nowe wiadomości do wyświetlenia na czacie np. co 5 sekund?

No to jest jakieś rozwiązanie. Jeśli odpowiednio sformułujemy zapytanie do serwera, aby serwer mógł wiedzieć, że chcemy dostać informację czy są nowe wiadomości na czacie, a jeśli tak to jakie, to jesteśmy w domu.

W praktyce nie jest to tak trudne jak mogłoby się wydawać. Standardowa technika to odpytywanie się serwera w określonym interwale czasowym (zależnym od potrzeb) o nowe informacje. Później są różne optymalizacje standardowego server polling. Można np. zwiększać interwał gdy nie było ostatnio informacji, a zmniejszać gdy były, aby gra adaptowała szybkość komunikacji do jej intensywności. Można też robić tzn. long-polling. To dosyć przydatna sztuczka. Polega ona na tym, że zamiast wykonywać ciągłe zapytania do serwera robimy jedno zapytanie, a serwer sztucznie wstrzymuje odpowiedź na to zapytanie aż sytuacja się zmieni. Np. zapytanie o wiadomość na czacie może być utrzymywane tak długo aż pojawi się wiadomość. Wtedy serwer odpowiada jaka jest wiadomość, klient ją przetwarza i dopiero wtedy nawiązuje nowe “połączenie”.

Czytaj podobne  Facebook kasuje profile firm i organizacji. Ustrzeżcie się zanim będzie za późno

Więcej o tych technikach w następnej części.

Przeczytaj też

Programowanie gier społecznościowych na Facebooka ... W czym pisać kod gry? W PHP czy w JS? No i gdzie trzymać dane o rozgrywce i grach? Dowiedz się! W poprzednich częściach omówiłem kwestię wyboru ser...
Programowanie RMSBG na Facebooka cz. 5 – host gry... Kim jest host gry i czy powinien znajdować się na serwerze czy powinien nim być jeden z graczy? W poprzednich częściach ustaliliśmy środowiska prog...
Programowanie RMSBG na Facebooka cz. 4 – typ... Jakie typy komunikacji trzeba uwzględnić w pisaniu gry RMSBG? W poprzednich częściach założyliśmy, że robimy grę planszową RMSBG (Realtime Multipla...
Programowanie RMSBG na Facebooka cz. 2 – Jęz... Jakie języki programowania trzeba znać, żeby pisać RMSBG na Facebooka? Dowiedz się. W poprzedniej części poruszyłem temat decyzji czy aby napisać R...
Programowanie gier społecznościowych czasu rzeczyw... Czy aby pisać gry RMSBG trzeba korzystać z serwera? Dowiedz się! Po latach pisania gier online postanowiłem podzielić się moimi doświadczeniami na ...
Napisano w Społecznościowe Tagi: , , ,