Witam, na podstawie kodu znalezionego w internecie stworzyłem server i clienta. Komunikują się one za pomocą NIO. Właściwie to komunikacja polega na tym, że informacja wysłana z clienta jest poprawnie odczytywana przez server, jednak w drugą stronę już tak pięknie nie jest. W związku z tym prosiłbym o wskazówki w jaki sposób mogę uporać się z tym problem. Poniżej zamieszczam kod źródłowy obu klas:
client - http://4programmers.net/Pastebin/5472
server - http://4programmers.net/Pastebin/5473
Ale nada się jako podstawa do komunikacji między serverem, a klientem, czy istnieje jakieś bardziej wydajne, lepsze rozwiązanie? Zależy mi na przesyłaniu danych z servera do klienta i vice versa, dla pewnej określonej liczby klientów. Oczywiście obsługa wielu klientów jednocześnie jest wymagana, ponieważ moim produktem końcowym miałaby być prosta gra karciana online dla kilku użytkowników.
Cieszę się, zatem wracając do meritum - czy ktoś zna rozwiązanie w jaki sposób najlepiej by było przesyłać również informację w drugą stronę, z servera do clienta? Ponieważ tak jakby praca metody send(), czy read() jest ciągła i wywołanie ich po sobie doprowadza do tego, że wykonywana jest tylko ta pierwsza. Można użyć jednej metody w drugiej, ale wtedy ta wywołana wewnątrz również się nie kończy i tym samym dalszy ciąg metody wywołującej drugą nie jest wykonany. Kod - Pastebin
Sorry, kod się nie wkleił. Właściwa wersja - http://4programmers.net/Pastebin/5479
Można oczywiście wywołać metodę send() w pętli while metody read(), będzie wysyłało i odczytywało. Tylko nie wiem, czy to jest dobry pomysł, czy raczej myśleć nad innym rozwiązaniem?
Znalazłem taką implementację servera i clienta - http://techwiki.ordak.org/index.php?title=How_To_Write_A_Multi-Threaded_Client-Server_Communications_in_Java#See_Also Wszystko działa poprawnie z serverem i jednym klientem - ClientDemo, jednak gdy tworzę dodatkowego klienta ClientDemo2 z kodem źródłowym ClientDemo, to już drugi klient nie zostaje obsłużony. I teraz pytanie, czy ktoś ma jakiś pomysł dlaczego? Server niby powinien przydzielić każdemu klientowi wątek, a jednak tak nie jest.
Niby powinien przydzielić a nie przydziela. Ten serwer jest jednowątkowy - nigdzie nie jest tworzony nowy wątek. Implementacja klienta też jest zła. Zamiast kopiować losowe kawałki kodu z internetu polecam na dobry początek:
Wątki: http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html
Sockety: http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
W rozdziale o socketach jest nawet przykładowa implementacja wielowątkowego serwera.
Dobra, napisałem server obsługujący wiele klientów tworząc dla każdego użytkownika nowy wątek. Czy ktoś może polecić jakieś materiały do nauki związane z obsługą wątków? W grze będzie brała udział większa liczba osób i nie wiem zbytnio jak się przełączać między nimi, aby dany gracz mógł wykonać swój ruch, wtedy pozostali czekają itp.
Znalazłem książkę Java, współbieżność dla praktyków. Czy dostanę coś lepszego, jeśli zamierzam zrealizować to, co opisałem w poście wyżej?