Open maro512 opened 7 years ago
Odważyłem się opublikować to co udało mi się z mozołem wypracować w kwestii serwera. Na razie nie ma to żadnego powiązania z resztą projektu. Postaram się w najbliższej przyszłości opisać o co w tym chodzi, ale już można sobie popatrzeć.
Najpierw trzeba odpalić LoopServer
a potem kilka (np. dwa) egzemplarze ClientTest
. Po wciśnięciu enter dla jednego z testowych klientów rozpoczyna się próba połączenia graczy, którzy potem wysyłają do siebie nawzajem ruchy (i nawet udaje im się obierać).
Numery portów są losowane, więc mogą się pokryć i wtedy nie zadziała (poza tym jest pewnie wiele rzeczy, które na razie nie działają). W praktyce nie będzie to miało żadnego znaczenia, bo każdy gracz będzie miał inne urządzenie.
ja starałem się to zrobić wykorzystując socket.io, socket.io trochę w tym pomaga bo daje automatycznie id gracza, zrobiłem wprowadzenie nicku i ogólny system połączeń czekałem na wtorek żeby dowiedzieć się o funkcjach które mam użyć do wykonywania ruchu, tylko teraz pytanie jest czy zostawiamy Twoją wersję czy ja nadal mam się bawić z moją bo bez sensu żebyśmy robili to same tylko w oparciu o inne biblioteki
Najwyżej przyniosę co mam na jutro zobaczymy Twoją i moją wersję i zadecydujemy :)
OK, możemy zobaczyć. Można też zrobić hybrydę, tj. serwer w oparciu o socket.io, ale zostawić moją koncepcję połączeń bezpośrednich pomiędzy graczami. Zobaczymy, któremu podejściu jest bliżej do tego, co trzeba jeszcze zrobić. Zabrałem się za tę komunikację, bo wszystko wyglądało, jakby stało w martwym punkcie.
bo tak przez chwilę było, musiałem ogarnąć tego soccket.io i połączyć to jakoś z libgdx żeby to testować i przyznam że nie szło mi to najlepiej, można zrobić tak że przerobię to na jutro na jakiś czat w menu albo coś takiego, bo wydaje mi się że nie będzie wcale ciężko, no nie wiem spróbuję.
Wydaje mi się, że w mojej wersji wystarczy zamienić Socket na SSLSocket (dla komunikacji z serwerem) i będzie można ordynarnie wysyłać hasło do serwera w komunikacie logowania.
Sorki że nic nie pisałem ale we wtorek mi się zepsuł komp, strzelił dysk, ale spokojnie już mam i biorę się do pracy :)
OK (jeszcze nie ruszyłem SSL)
yup widzę, mogę ja się z tym pobawić bo chyba ogólna zasada działania twojego serwera jest(była, RIP) podobna do mojego więc ogarniam właśnie te SSL, no chyba że masz już coś ?
Nie. Chyba wystarczy podmienić Socket na SSLSocket (i tą od serwera też), przy czym tam nie ma już prostych konstruktorów, tylko "metody fabryki". A komunikacji klient-klient chyba nie będziemy ruszać.
widzę właśnie, zajmę się tym a potem spróbuję podłączyć grę pod to zobaczymy co z tego wyjdzie
powiedz mi czy dobrze rozumiem, SSLSocket działa tak że przy połączeniu z serverem będzie sprawdzało "tożsamość" a potem przy połączeniu client-client będziemy przerzucać się na zwykłe sockety, bo "tożsamość" jest już sprawdzona. z grubsza o to chodzi? Dobrze rozumiem :) ?
Mniej więcej. SSL to bezpieczne połączenie, którym można przesłać hasła do sprawdzenia przez serwer. Logowanie jest tylko do serwera, bo tam "mamy" bazę użytkowników. Klient nikogo nie zweryfikuje. Wydaje mi się, że szyfrowanie połączenia klient-klient jest niepotrzebne, bo w końcu nic się nikomu nie stanie, jeśli ktoś będzie "podglądał" przebieg gry.
Udało mi się nawiązać połączenie SSL. Trzeba się trochę pobawić certyfikatami szyfrowania, których do końca nie rozumiem, ale działa. Problem w tym, że te certyfikaty trzeba jakoś zaszyć w naszą aplikację na Androidzie.
i udało Ci się to zrobić tak żeby nie było tylko 1 hasło do servera, tylko ile powiedzmy użytkowników tyle haseł ? Bo wszystko co ja zrobiłem opiera się na tak jakby na jednym haśle
i czy SSL jest na pewno potrzebny, widziałem na necie kody gdzie używało się normalnych Socketów tylko po prostu przy połączeniu server pytał się o hasło i nick i jeżeli było niewłaściwe to odrzucał połączenie, a coś takiego z tego co widziałem nie jest takie trudne :)
Na nasz użytek można właściwie zrezygnować z SSL, bo w końcu nic się nie stanie, jeśli nawet dane użytkowników Loop wyciekną. Można nawet zrezygnować z hasła w ogóle. Serwer tylko sprawdza, czy ma takiego użytkownika i tyle. Chyba, że dla picu będziemy szyfrować hasło jakimś prymitywnym algorytmem (typu przesuwamy litery o trzy do przodu i dla pewności zapisujemy od tyłu).
Te certyfikaty to faktycznie jakieś bagno. Do tego mają ograniczoną ważność i niby jak je potem wymieniać? Słyszałem kiedyś, że są takie algorytmy, że można się połączyć, powysyłać jakieś losowe liczby i każdy ma wygenerowany ten sam klucz, ale nigdzie tego nie widzę zaimplementowanego. Wszędzie tylko o tym SSL.
Użycie SSL opierałoby się na stworzeniu bezpiecznego połączenia. Tym połączeniem wysyłałoby się hasła "ręcznie" i weryfikowało na serwerze. Normalne połączenie TCP wysyła wszystko bez szyfrowania i jakby wysyłać hasło do sprawdzenia na serwerze, to ktoś może je przechwycić i wie dokładnie co wysłać, żeby się podszyć pod użytkownika. Dlatego bez SSL hasła są teoretycznie bez sensu. Mogą za to służyć jako zabezpieczenie przed "młodszą siostrą" - zawsze coś :).
to może zrobię jakąś prymitywne zapisywanie hasła i nick-u tak żeby tylko było :) zobaczymy co będzie dalej(już zacząłem) potem możemy pomyśleć nad jakimś szyfrowaniem, na razie "baza danych" czyli lista graczy zapisywana na serwerze i będę sprawdzał czy taki użytkownik jest na tej liście, a zawsze łatwo zrobić do tego rejestracje, więc jeżeli zdążę to zrobię to. Na razie logowanie i połączenie tego z grą, to są moje główne cele bo nie wiem czy w tyg będę miał kompa więc muszę to skończyć dziś :)
OK. Tylko trzeba chyba zmodyfikować metodę logIn
klienta (wysłać hasło) i authenticateUser
serwera (która na razie niewiele robi).
wiem, widzę już przeanalizowałem Twój kod i zajmuje się modyfikacją :)
Powodzenia! :)
Powiedz mi możemy się spotkać jakoś w tygodniu ? Bo niekiedy mam wrażenie że nie rozumiem Twojego kodu :) i po prostu wytłumaczyłbyś mi co i jak dokładnie, (np.zmienna "name" na serverze), tylko niestety nadal nie mam kompa i czy mógłbyś przynieść lapka ^^ ja wrzucę dziś klasę która teoretycznie będzie sterowała grą, ale czy będzie działać tego jeszcze nie wiem, najlepiej jakbyś mi dał znać kiedy masz czas w tym tyg, myślę że jakoś się dostosuje
Mam czas np. wtedy co zwykle we wtorki albo w środę przed 12.
name
na serwerze to nick gracza. To nie jest zmienna serwera, tylko tej klasy wewnętrznej ClientInteraction
obsługującej połączenie z jednym klientem.
w środę kończę przed 11:30 więc jakbyś mógł to spotkajmy się :) najpewniej skończę wcześniej niż 11:30 coś ok. 11 więc napiszę Ci na Gicie jak będą kończyć się zajęcia i poczekam :) do zobaczenia w środę
Przyjdę na 11. Jak możesz, to wrzuć to co masz na GitHuba, żeby można było coś z tym robić.
Jutro na ćwiczeniach z rps to wrzucę
I przyjdź tak 11:15 żebyś nie musiał czekać, gdzieś w okolicy akwarium będę :)
mam pytanie po co jest w Client
w metodzie acceptPlayRequest
w if-ie user.processCommand(args) ?? bo nie rozumiem co to ma robić, albo bardziej sprawdzać
To ma przyjąć/odrzucić żądanie rozpoczęcia gry. Na razie akceptujemy wszystkie żądania, to niech processCommand
zwraca true
dla każdego komunikatu CMD_PLAY
(o ile gra nie jest w trakcie!). Ale dodatkowo można tą drogą dostarczyć nick drugiego gracza.
Do "uwag..." na ioloopgame dodałem bardziej szczegółowy opis działania gry online (tego jak sobie to wyobrażam).
Poza tym, jeśli nie ma osobnego logowania (niezależnego od gry online), to gracze praktycznie nie mają szans się połączyć ze sobą, bo drugi musi być już zalogowany, gdy serwer dostanie żądanie gry.
Wydaje mi się, że warto wydzielić serwer jako osobny moduł projektu (kod serwera jest w module core
, czyli byłby zawarty także w wersji klienckiej, a chyba nie powinien, zwłaszcza, że będzie korzystał z dostępu do bazy danych, którego inne klasy nie potrzebują). Po paru nieudanych próbach oddzieliłem klasę LoopServer
, OnlineLoopGameTest' oraz
Player_Serverdo osobnego modułu. Wszystkie stałe z klasy
LoopServertrzeba było przenieść do klasy
Client(wprowadziłem konieczne poprawki w innych klasach korzystających z pakietu
Net`). Mogę wrzucić tę modyfikację na Gita, jeśli nikt nie ma nic przeciwko.
Wrzuć,obczaje to jutro bo jutro chcę to doprowadzić do jakiegoś ogarniętego stanu :)
Wrzucone. Jako nowa gałąź (po pierwszych, nieudanych próbach stworzenia nowego modułu zrobiłem sobie nową gałąź, a potem wolałem nie ryzykować scalania z wyjściową). Może można usunąć NewNet? Nie mogłem się powstrzymać i zmieniłem trzy drobiazgi w interfejsie (znaki hasła, koniec z klikaniem na niedostępne płytki i nieco wyraźniejsze zaznaczanie).
Dobra ja to dokończę w czwartek bo dopiero wtedy będę miał dostęp do kompa
spotkalibyśmy się jutro o tych godzinach co zawsze, połączymy ten online serwer z twoją bazą danych, OK ? Znaczy ja już dziś to zacząłem, ale nie jestem pewny czy wszystko dobrze :).
OK. Właściwe to sam też dodaję bazę do funkcjonalności serwera (już całkowicie zastąpiłem tamtą atrapę bazy).
Jest problem z połączeniem na androidzie...
Scaliłem grę online z new-ui (ręcznie) i wrzuciłem na gita. Jak zmodyfikuje się jedno false na true w kodzie LoopServer
powinno się dać wyłączyć połączenie z bazą i testować nie mając SQL Servera (wtedy każde logowanie się udaje).
Nowy ekran 'OnlinePlayInput' czasem się blokuje (na razie lepiej naciskać Start tylko gdy gra na pewno będzie przyjęta). Plansza się rozjeżdża przy skalowaniu...
Piotrek, nie zmieniaj ciągle grafik empty cell i secected, bo te co były tworzą pewną kompozycję z całością, a tak to mamy każdy element w innym stylu
Dobra, już nie będę kontynuował swojej wersji. Trochę o tym zapomniałem i w 'online-play' tak naprawdę nie zgadza się to ani z moją, ani z "klasyczną" wersją...
Pracuję nad implementacją komunikacji z serwerem. Model komunikacji będzie taki jak sobie wyobrażałem (o ile w końcu zacznie działać :) - gracze łączą się z serwerem, ale gra odbywa się na połączeniu bezpośrednim, które jest ustalane dzięki przesyłaniu przez serwer numeru portu. Na razie w oderwaniu od projektu (ale w pakiecie
com.loop.game.net
). Jak zadziała, to podpięcie bazy danych itd. powinno być już "proste".