maro512 / Loop2

Apache License 2.0
0 stars 0 forks source link

wersja online #6

Open maro512 opened 7 years ago

pzjp commented 7 years ago

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".

pzjp commented 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.

sieka44 commented 7 years ago

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

sieka44 commented 7 years ago

Najwyżej przyniosę co mam na jutro zobaczymy Twoją i moją wersję i zadecydujemy :)

pzjp commented 7 years ago

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.

sieka44 commented 7 years ago

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ę.

pzjp commented 7 years ago

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.

sieka44 commented 7 years ago

Sorki że nic nie pisałem ale we wtorek mi się zepsuł komp, strzelił dysk, ale spokojnie już mam i biorę się do pracy :)

pzjp commented 7 years ago

OK (jeszcze nie ruszyłem SSL)

sieka44 commented 7 years ago

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ś ?

pzjp commented 7 years ago

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ć.

sieka44 commented 7 years ago

widzę właśnie, zajmę się tym a potem spróbuję podłączyć grę pod to zobaczymy co z tego wyjdzie

sieka44 commented 7 years ago

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 :) ?

pzjp commented 7 years ago

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.

pzjp commented 7 years ago

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.

sieka44 commented 7 years ago

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

sieka44 commented 7 years ago

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 :)

pzjp commented 7 years ago

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.

pzjp commented 7 years ago

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ś :).

sieka44 commented 7 years ago

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ś :)

pzjp commented 7 years ago

OK. Tylko trzeba chyba zmodyfikować metodę logIn klienta (wysłać hasło) i authenticateUser serwera (która na razie niewiele robi).

sieka44 commented 7 years ago

wiem, widzę już przeanalizowałem Twój kod i zajmuje się modyfikacją :)

pzjp commented 7 years ago

Powodzenia! :)

sieka44 commented 7 years ago

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

pzjp commented 7 years ago

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.

sieka44 commented 7 years ago

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ę

pzjp commented 7 years ago

Przyjdę na 11. Jak możesz, to wrzuć to co masz na GitHuba, żeby można było coś z tym robić.

sieka44 commented 7 years ago

Jutro na ćwiczeniach z rps to wrzucę

sieka44 commented 7 years ago

I przyjdź tak 11:15 żebyś nie musiał czekać, gdzieś w okolicy akwarium będę :)

sieka44 commented 7 years ago

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ć

pzjp commented 7 years ago

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.

pzjp commented 7 years ago

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.

pzjp commented 7 years ago

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' orazPlayer_Serverdo osobnego modułu. Wszystkie stałe z klasyLoopServertrzeba było przenieść do klasyClient(wprowadziłem konieczne poprawki w innych klasach korzystających z pakietuNet`). Mogę wrzucić tę modyfikację na Gita, jeśli nikt nie ma nic przeciwko.

sieka44 commented 7 years ago

Wrzuć,obczaje to jutro bo jutro chcę to doprowadzić do jakiegoś ogarniętego stanu :)

pzjp commented 7 years ago

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).

sieka44 commented 7 years ago

Dobra ja to dokończę w czwartek bo dopiero wtedy będę miał dostęp do kompa

sieka44 commented 7 years ago

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 :).

pzjp commented 7 years ago

OK. Właściwe to sam też dodaję bazę do funkcjonalności serwera (już całkowicie zastąpiłem tamtą atrapę bazy).

pzjp commented 7 years ago

Jest problem z połączeniem na androidzie...

pzjp commented 7 years ago

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...

maro512 commented 7 years ago

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

pzjp commented 7 years ago

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ą...