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  Praca programisty (może) być świetna

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  Dlaczego nie zgłaszam już błędów Microsoftowi

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

Przeczytaj też

Najlepsza książka do Pythona Nie wiesz, z jakiej książki/ebooka uczyć się programowania w języku Python? Postanowiłem zrobić zestawienie 10 książek z Heliona na ten temat, abyś mó...
Komplet 28 ebooków i kursów, aby zostać programist... Od jakiegoś czasu dostaję zapytania na temat tego jakie książki, kursy i ebooki polecam. W związku z tym postanowiłem przygotować dzisiaj zestaw, któr...
120 tapet programistycznych za darmo do pobrania Trochę mi się nudziło, więc przygotowałem zestaw 120 tapet dla programistów. Możesz go pobrać. Tapety są w rozdzielczości 1366x768. Podzielone ...
10 fiszek do nauki programowania w Pythonie Uczysz się programowania w Pythonie? Pobierz te 10 fiszek, które ułatwią Ci zapamiętanie funkcji wbudowanych* w Pythona! Programowanie potrafi ...
Napisano w Kolumna Tagi: , , ,

Menu