Wpis z mikrobloga

Mirki chciałem sobie zaimplementować serwis do gry w szachy.
Zastanawiam się jaki protokół wykorzystać do przesyłania ruchów.

Gracz wysyła ruch na serwer -> Serwer sprawdza poprawność ruchu -> Serwer wysyła nową pozycję do obu graczy w grze
Wysyłanie co ruch żądania POST wydaje mi się zasobożerne i wolne.

Myślę, że powinienem wykorzystać
REST api (http) - do tworzenia gry, konta itd
Socket (tcp) - serwer dla gry ma osobny wątek który trzyma: socket per gracz i jest pośrednikiem (tj. gracza A robi ruch -> serwer waliduje -> wysyła do obu graczy nową pozycję)

Trochę mnie dziwi, bo lichess.org ma API do wykonania posunięcia
https://lichess.org/api#operation/boardGameMove
ale jak gram przez web, to nie widzę w konsoli by szły żądania POST posunięć

Jak to ugryźć bo nie mam doświadczenia? Programować będę w Javie jak to ma jakiś wpływ.
Ewentualnie możecie polecić jakąś bibliotekę do komunikacji sieciowej, jeśli sam Socket javowy jest zbyt niskopoziomowy, bo w Springu pewnie zrobię tylko REST Api

#java #naukaprogramowania #programowanie #szachy
  • 15
  • Odpowiedz
@Lewo: dopóki nie piszesz aplikacji w której spodziewasz się równolegle setek tysięcy graczy to REST jest ok. Napisz wszystko tak, żeby w miarę łatwo móc podmienić protokół i sobie sprawdzisz jak działa jedno i drugie, tak czy inaczej chcesz się nauczyć.
  • Odpowiedz
Wysyłanie co ruch żądania POST wydaje mi się zasobożerne i wolne.


@Lewo: To będzie blitz chess na światowym poziomie ( ͡° ͜ʖ ͡°) ? Jeżeli nie, to POST nie będzie za wolny.
  • Odpowiedz
@bambadjan: w sumie chciałbym to napisać z ciekawości tak jak powinno to być w komercyjnym projekcie.

Zastanawiam się tylko czy jak przerzucę się z rest http na coś innego to strasznie utrudni to pisanie kodu czy też nie.
  • Odpowiedz
@cochese: okej. dlatego właśnie też mi się wydaje, że te api na lcihess dostępne jest jakby ktoś chciał swojego klienta napisać. ale ich domyslny dziala jakoś inaczej bo nie widzę żądań. Chyba, że te żądania "http" są wysyłane jako body treści przez socketa :D
  • Odpowiedz
@bambadjan: jak dobrze odizoluje pojedynczą gre to będzie kwestia zmienienia proxy. Tylko z moim juniorskim doświadczeniem zrobię jakiś powiązany syf :D no to zobaczymy :) Najwyżej dla zabawy czat w grze napiszę w websocketach dla sprawdzenia się.
  • Odpowiedz
@Lewo:

Zastanawiam się tylko czy jak przerzucę się z rest http na coś innego to strasznie utrudni to pisanie kodu czy też nie.


Jeśli logikę wyrzucisz po za kontrolery i fajnie porozdzielasz serwisy, to w teorii http to tylko medium transportowe, które zamieniając na ws nie powinno zabrac duzo czasu
  • Odpowiedz
@Lewo: Dobra ziom, doczytałem całego twojego oryginalnego posta. Skupmy się na tym fragmencie:

gracz A robi ruch -> serwer waliduje -> wysyła do obu graczy nową pozycję


Otóż POST, jak każda inna metoda HTTP działa w schemacie "żądanie -> odpowiedź", przy czym to klient HTTP wysyła żądanie do serwera, a serwer odpowiada. Serwer nie może ani wysłać żądania do klienta, ani odpowiedzieć, jeżeli klient nie wyśle żądania. Biorąc to pod uwagę
  • Odpowiedz
a wcześniejsza odpowiedź o tym, że "POST nie będzie za wolny" była błędna, bo połowiczn


@cochese: dzięki, chociaż akurat chciałem przedstawić schemat komunikacji jaki widzę, że jest potrzebny (bez sugerowania, że to da się zrobić w http).

Masz rację, dlatego właśnie pisałem też coś o tym, że sama pojedyncza gra powinna być wątkiem serwera, który trzyma dwa połączenia per gracz i może tak się z nimi komunikować.

Jeśli chodzi o HTTP
  • Odpowiedz
@cochese:
z ciekawości zrobiłem dzisiaj reseach o WebSocketach i takie coś znalazłem w Springu docsach

The best fit for WebSocket is in web applications where the client and server need to exchange events at high frequency and with low latency


Even in cases where latency is crucial, if the volume of messages is relatively low (e.g. monitoring network failures) the use of long polling should be considered as a relatively simple
  • Odpowiedz