Witam. Chcę napisać gierkę multiplayer z serwerem zewnętrznym opartym na protokole UDP, ale zauważam pewien problem. Chodxi mi o to, żeby wysłać jakieś dane trzeba podać dokładną lokalizacje klinta. Zakładając, że byłby serwer na ruterze z przekierowanymi portami wysłanie danych do niego nie byłoby problemem. Ale co jak serwer na wysłać coś do klienta w innym wi fi?
- Rejestracja:ponad 15 lat
- Ostatnio:prawie 9 lat
"żeby wysłać jakieś dane trzeba podać dokładną lokalizacje klinta" - nie, żeby wysłać jakieś dane, trzeba podać dokładną lokalizację serwera, nie klienta. Jest serwer, klienci sie do niego podłączają. Nigdzie nie trzeba sie przebijać przez NAT. Jeśli jednak bardzo chcesz, poczytaj o UDP hole punching.
- Rejestracja:ponad 10 lat
- Ostatnio:ponad 4 lata
- Postów:37
Dzięki. Trochę poczytałem i znalazłem przykład który trochę rozbudowałem. Jest to serwer z dwoma klientami. Gdy klient wciśnie przycisk jest wysyłana wiadomość do serwera, a ten wysyła wiadomość do klienta. Gdzie problem? Otóż mam połączonych dwóch klientów, ale gdy wysyłam wiadomość od jednego z nich to serwer odpowiada tylko temu, a nie obydwu. Wie ktoś dlaczego? Mój kod: http://ideone.com/h3olOl

- Rejestracja:ponad 11 lat
- Ostatnio:8 miesięcy
- Lokalizacja:Genewa
- Postów:597
Dlaczego cała logika opiera się na klikaniu buttonami (jeszcze do tego nienazwanymi)?
Serwer powinien sam przyjąć wiadomość i wysłać odpowiedź, bez angażowania w to buttonów. Poza tym - ja bym na początek porzucił gui, stworzył klasę serwer i klasę klient, uzupełnił je po czym nawet w funkcji main napisał kod kliencki, a najlepiej rozbił to sobie na dwie proste aplikacje. Wtedy odpalasz ilu chcesz klientów i możesz sobie manualnie testować swój serwer.

- Rejestracja:ponad 11 lat
- Ostatnio:8 miesięcy
- Lokalizacja:Genewa
- Postów:597
Dodam Ci odpowiedź zamiast komentarza, bo będzie ciut dłużej.
Uzupełnić możesz odpowiednimi metodami oczywiści - send, receive, connect itp.
Co do Twojego programu:
- masz wątek w wątku - tego można się spokojnie pozbyć z tego co widzę, bo tylko ten zagnieżdżony wykonuje jakieś operacje.
- już wiem czemu tylko jeden otrzymuje. Bo wysyłasz dwóm klientom na ten sam adres, na ten sam port. Tutaj będzie miał miejsce wyścig i który pierwszy odbierze, ten ma wiadomość. Możesz stworzyć strukturę, w której wysyłasz informację do kogo jest wiadomość adresowana, skoro łączysz się z tych samych ip.
Póżniej jeśli rzeczywiście chcesz mieć trochę bardziej rzeczywisty serwer, będziesz musiał dodać mechanizmy, gdy serwer będzie np. tworzył wątek obsługujący każdy adres, który się z nim komunikuje.


- Rejestracja:ponad 12 lat
- Ostatnio:ponad rok
- Lokalizacja:Polska, Kraków
@xfin "No tak, tylko teraz myślę, że z drugiej strony to wyścigu nie rozwiąże. Podstawowy problem tutaj to komunikacja przez ten sam adres i port. Na jednym komputerze można tak testować tylko jednego klienta."
Nie zgadzam się przecież każdy klient jest pod innym portem? Więc żaden wyścig nie ma miejsca... ;)
Zrób prostą rzecz podczas pierwszego połączenia klienta do serwera wyślij informacje np. "Hi!". Po stronie serwera zapisz sobie ten adres klienta do jakiejś listy i później używaj wedle potrzeb.
Dodatkowo co jakiś czas możesz odpytywać klientów czy wciąż są aktywni jak nie to usuwać z listy.
Przerobiłem trochę twój kod żeby to zobrazować mnie więcej. Większość przekopiowałem od Ciebie...

- Rejestracja:ponad 10 lat
- Ostatnio:ponad 4 lata
- Postów:37
Dobra, udało mi się to zrobić, w ten sposób, że zapamiętuję w liście wszystkie IPEndPoint'y, od których przyszły wiadomości, a następnie w pętli wysyłam pod każdy z nich. Działa to, ale prawdę mówiąc nie wiem jakim cudem. Każdy z IPEndPoint'ów różni się portem, a ja nie mam pojęcia czemu. Niby wszystko działa na porcie 8008, ale okazuje się, że działa to na porcie 5xxxx. Ale to jest kwestia podrzędna. Jeśli przekieruję porty i będę łączyć się z różnych wi fi, serwer nadal będzie wysyłać dane do wszystkich klientów? Mój kod: http://ideone.com/0oS2H0

- Rejestracja:ponad 12 lat
- Ostatnio:ponad rok
- Lokalizacja:Polska, Kraków
Tak jest jak się kopiuje bez sensu. :P
UdpClient server = new UdpClient(8008); // Podajesz port ręcznie serwera...
client = new UdpClient(); // Port jest generowany automatycznie
client2 = new UdpClient();// Następny port wygenerowany