Przykład transferu FTP: pobieranie dodatkowych poziomów do gry

Na pierwszy ogień postanowiłem, że Wam pokażę w jaki sposób można napisać system pobierania dodatkowych poziomów do gry, która się opiera np. na systemie mapy kafelkowej.


Ten system będzie działał w analogiczny sposób do aktualizacji naszej gry, ale do rzeczy: załóżmy, że wypuściliśmy grę lecz później postanowiliśmy dodać kilka nowych poziomów (DLC :P ), a użytkownicy jak wiadomo są leniwi i nie lubią gdy muszą pobierać pliki w sposób manulany i później muszą wklejać kod do gry bo boją się, że coś źle albo zrobią.

Z pomocą im przychodzi system, który przezornie wrzuciliśmy do gry, czyli menu „Dodatkowe poziomy” gdzie poprzez 1 kliknięcie użytkownik pobiera poziom. Takie jest założenie.

Na początku musimy posiadać jakiś serwer ftp, ja do tych testów skorzystam z cba.pl, rejestrujemy domenę i w sekcji konta FTP mamy login do naszego konta FTP, a jeżeli chcemy dostać się do naszych plików od strony web po prostu wchodzimy na adres naszej domeny w przeglądarce i klikamy Menadżer plików.

Na CBA mamy 1GB wolnego miejsca, lecz pojedynczy plik nie może mieć więcej niż 10mb, na nasze możliwości w zupełności nam wystarczy.

Oczywiście poniżej nie wrzucam niczego odkrywczego, jest to raczej prosty kod w konsoli bo transfer FTP jest banalny, jeżeli chcesz możesz pobrać plik exe, który przygotowałem poniżej aby przetestować pobieranie samych plików (są to poziomy z mojej gry SQUARE), a poniżej jest sam kod bez danych do konta poniżej (lub w wersji na GitHub):

To tyle jeżeli chodzi o ten artykuł, przy przykładzie gry dla 2 osób będzie nieco więcej SFML’a samego w sobie.

Plik „.exe

Slight Edge

Witam, w tym artykule chciałbym Was zachęcić do sięgnięcia po książkę Slight Edge, a to dlatego że potrafi ona zmienić w bardzo dużym stopniu sposób w jaki podchodzimy do różnych czynności.

Więcej

Najbliższe plany

Witam Was w kolejnym newsie informacyjnym, w którym dowiecie się o najbliższych planach odnośnie tego co będzie się pojawiało na blogu.

Więcej

Transfer plików (FTP)

Dla niewtajemniczonych


Jeżeli wiesz czym jest FTP to przejdź do następnego paragrafu.

FTP (file transport protocol) jest to protokół, który pozwala nam manipulować plikami w sposób zdalny. Ten protokół jest sam w sobie prosty, posiada kilka komend typu: utwórz folder, usuń plik, pobierz plik, itp. Aby one działały to komputer do którego wysyłasz te komendy musi mieć uruchomiony serwer FTP, aby mógł „zrozumieć” i wykonać nasze komendy.

Podsumowując: do czego może nam się przydać FTP? Otóż dzięki temu możemy np. zrobić taki feature w naszej grze jak pobieranie map z sieci i dzięki FTP będziemy mogli to osiągnąć. Moglibyśmy także zapisywać zapisywać grę gracza nie lokalnie na dysku lecz w „chmurze”. Dzięki temu mógłbyś też zrobić automatyczne aktualizacje swojej gry.

Jeżeli chcesz dowiedzieć się więcej o FTP polecam inne źródła, chociażby Wikipedie.

 

Klasa klienta FTP


Klasa, która służy do obsługiwania FTP w SFML to jak łatwo można się domyślić sf::Ftp. Jest to klient, czyli możemy łączyć się z serwerem FTP, wysyłać mu komendy, wysyłać/pobierać pliki.

Każda metoda w tej klasie zawiera komendę FTP oraz zwraca standardową odpowiedź FTP. Każda odpowiedź zawiera kod statusu (podobne do HTTP, ale nie takie same) oraz wiadomość informującą nas co się dokładnie stało. Odpowiedzi FTP są zawarte w klasie  sf::Ftp::Response.

Status można użyć do sprawdzenia czy komenda zakończyła się pomyślnie. Jeżeli wartość statusu jest mniejsza niż 400 to zakończyło się powodzeniem, w przeciwnym razie mamy do czynienia z błędem.

Możesz też użyć metody isOk(), która mówi nam tylko czy zakończono błędem czy pomyślnie.

Jeżeli nie dbasz o szczegóły można to zrobić nawet jeszcze krócej:

Dla lepszej czytelności te sprawdzenia poprawności wykonania komend nie będą pisane w dalszej części tego poradnika, ale ty powinieneś je pisać w swoim kodzie.

 

Łączenie z serwerem FTP


Pierwszą rzeczą jaką musimy zrobić to połączenie się z serwerem:

Jako adres podajemy jakikolwiek poprawny sf::IpAdress: ip, URL, nazwę sieci…

Standardowym portem dla FTP jest 21. Jednakże gdyby twój serwer korzystał z innego portu możesz dodać go jako drugi argument.

Jako trzeci opcjonalny argument możesz podać timeout, czyli czas jaki będzie czekał twój program na nawiązanie połączenia z serwerem.

Gdy już udało ci się połączyć to następnym krokiem jest autoryzacja dostępu do serwera:

 

Komendy FTP


Tutaj znajdziesz wszystkie dostępne komendy w klasie sf::Ftp i ich krótki opis. Pamiętaj, że wszystkie komendy działają względnie do obecnej ścieżki, tzn jeżeli uruchomisz komendę będąc wcześniej w home/file, to komenda zadziała w folderze file, a nie home. Działa to dokładnie tak samo jak z komendami w konsoli na twoim OS.

Pobranie ścieżki na której obecnie pracujemy

sf::Ftp::DirectoryResponse to wyspecjalizowana klasa sf::Ftp::Response, która zawiera żądany katalog.

Pobieranie listy katalogów i plików w nich się zawierających

sf::Ftp::ListingResponse to klasa dziedziczona po sf::Ftp::Response posiadająca żądania do katalogów/plików.

Zmiana katalogu

„W górę”

czyli katalog, z którego weszliśmy do katalogu w którym jesteśmy teraz.

Tworzenie nowego katalogu

Usunięcie istniejącego folderu

Zmiana nazwy

Usunięcie istniejącego pliku

Pobranie pliku

Ostatni argument to sposób transferu pliku, istnieje ich kilka: Ascii (do plików tekstowych), Ebcdic (dla plików tekstowych używających zestawu znaków EBCDIC), Binary (dla plików nie-tekstowych). Ascii i Ebcdic mogą przekształcać tekst plik podczas jego transportowania, tak aby dopasować go do środowiska klienta. Binary bezpośrednio kopiuje plik bajt po bajcie.

Wysyłanie plików (na serwer)

Przedłużanie połączenia

Serwery FTP zazwyczaj kończą połączenie gdy nie jesteśmy przez jakiś czas aktywni (nie wysyłamy tam komend). Jeżeli chcesz uniknąć rozłączenia możesz użyć komendy.

 

Rozłączanie z serwerem FTP


Możesz się rozłączyć z serwerem w każdej chwili za pomocą metody:

 

Oryginalny artykuł

SFML i HTTP

Wstęp


Taka uwaga czysto ode mnie: moja znajomość HTTP jest dość mała i ostrzegam, że mogą się zdarzyć błędy w przetłumaczonych nazwach itp. Jeżeli takie się zdarzą dajcie znać w komentarzach.

SFML posiada prostą klasę klienta HTTP, dzięki której możesz się komunikować z serwerami web. Tak jak wspomniałem prostą komunikację, czyli możesz korzystać z: HTTP: POST, GET i żądań typów HEAD, zdobywanie dostępu do nagłówków pól HEAD oraz czytania/pisania stron.

Jeżeli to dla ciebie za mało i potrzebujesz np dostępu do HTTPS to odsyłam cię do bibliotek stworzonych właśnie w tym celu jak libcurl czy cpp-netlib.

Jednak do podstawowej komunikacji pomiędzy programem a serwerem web funkcje zawarte w SFML powinny nam wystarczyć.

 

sf::Http


Do komunikowania z serwerami HTTP używamy klasy sf::Http.

Zauważ, że nie dokonujemy tutaj żadnego połączenia, a jedynie ustawiamy adres z którym będziemy się łączyć. Nasz program łączy się jedynie tymczasowo przy każdej wykonywanej czynności.

Tutaj jest w zasadzie tylko jedna metoda wysyłająca żądania do strony i to jest w zasadzie wszystko co ta klasa robi.

 

Żądania (requests)


Żądania HTTP reprezentowane są przez klasę sf::Http::Request. Klasa ta może zawierać poniższe informacje:

  • metoda: POST (wysyła jakieś dane), GET (pobieranie danych), HEAD (pobranie nagłówka źródłowego bez  sekcji body)
  • URI: adres jakiegoś zasobu (strona, obraz, …) do pobrania/wysłania, adres względem hosta
  • HTTP version (standardowo 1.0, jednak możesz użyć innej aby uzyskać dostęp do innych elementów tej wersji)
  • header: ustawia pole wraz z kluczem i wartością
  • body strony (używane jedynie przy metodzie POST)

SFML automatycznie wypełnia pola obowiązkowe nagłówka, takie jak „host”, „Content-Length”, itp .Możesz wysyłać żądania (requesty) bez obaw, bo SFML dołoży starań aby były poprawne ;) .

 

Odpowiedzi (responses)


Jeżeli udało nam się pomyślnie połączyć i wysłać żądanie do hosta to odpowiedź ze strony zostanie odebrana przez klasę sf::Http::Response, która posiada następujące elementy:

  • status, który w precyzyjny sposób pokazuje jak serwer zareagował na nasze żądanie (ok, redirected, not found, etc.)
  • wersję http
  • nagłówek: z kluczem i wartością
  • „body of response”

 

Przykład: wysyłanie wyniku do serwera online


Poniżej możesz zobaczyć w jaki sposób można wysłać zdobyty wynik przez gracza do serwera.

Oczywiście pokazany tutaj sposób jest bardzo prosty, nie posiada absolutnie żadnych zabezpieczeń i każdy może wysłać punkty. Zabezpieczeniem mógłby być np dodatkowy parametr w postaci hash kodu, który upewniałby nas że kod wysłano przez program. Jednak to wychodzi poza ten tutorial.

Na koniec jak mogłaby wyglądać strona PHP odbierająca nasze punkty:

Oryginalny artykuł