SocketServer i IP adres

0

Witam

Zastanawiam się jak czym jest właściwe SocketServer. Nazwa klasy wskazuje, że jest to gniazdo serwera, ale gdzie ten serwer jest. Do konstruktora przekazujemy tylko numer portu, a gdzie adres IP danego serwera?

new SocketServer(8189);

Utworzyłem sobie taki socket jak powyżej. Za pomocą telnetu uruchamianego z konsoli komputera mogę połączyć się z dowolnego komputera wpisując jakiś adres IP, w tym przypadku mój albo 127.0.0.1 (adres IP udostępniany przez autora książki "Java. Techniki zaawansowane" Cay. S. Horstmann). Ważne tylko żeby port się zgadzał. I wpisując ten dowolny adres IP łączę się z moim programem w którym utworzyłem tenże socket. Czy ktoś mógłby mi wyjaśnić sens i ideę tej klasy. Raczej wyobrażałbym sobie, że ta klasa tworzy jakiś serwer o określonym adresie IP i porcie i tylko klient podający ten konkretny adres IP oraz port może się połączyć z programem który obsługuje ten konkretny serwer - niestety tak to nie działa, dlatego nie do końca rozumiem sens istnienia klasy SocketServer.
W zwykłym Sockecie podaje się adres IP oraz port, co jest dla mnie zrozumiałe, bo chcemy połączyć się z konkretnym komputerem o tym adresie IP oraz porcie, a w przypadku SocketServer jest inaczej...

0

Daje po prostu odpowiednik c#'owego 'IPAddress.Any. Jakbyś w IP serwera wpisał 127.0.0.1 to czy koledzy mogli by sie podłączyć z tej samej sieci? Akceptuje po prostu na dowolnym adresie.

0

Tak w skrócie na chłopski rozum:
ServerSocket udostępnia port, Socket łączy się na port serwera.
Kiedy podajesz port w ServerSocket - udostępniasz port i klienci mogą się z Tobą skomunikować - jak wywołasz metodę accept bodajże to odbierasz to połączenie i możesz jakoś zareagować, np odesłać HTML strony czy cóś.
Metoda accept zwracała Socket do komunikacji zwrotnej o ile mnie pamięć nie myli. Ogólnie znając zasadę działania TCP to wydaje się logiczne :)
Odsyłam https://tools.ietf.org/html/rfc793#page-10

0

Popatrz w dokumentację, SocketServer ma też konstruktor z 3 parametrami, w tym jeden z nich to adres IP interfejsu sieciowego na którym chcesz nasłuchiwać. I oczywiście możesz się połączyć z zewnątrz tylko podając "publiczny" adres tego interfejsu.

0

A czy SocketServer przechowuje informacje na temat adresu IP komputera na, na ktorym został uruchomiony? W przypadku Socket po stronie kluenta podajemy IP serwera i port serwera, z którym chcemy się połączyć. Ale skąd SocekServer wie, że jest gniazdem tego konkretnego serwera, z którym klient żąda się połączyć?innymi słowy:

  1. Skąd program, który obsługuje obiekt SocketServer wie, że musi odpowiadać na dane żądanie klienta a na inne nie? (Zakładam że ma z tym.coś wspólnego numer portu)
  2. Skąd SocketServer wie z jakiego serwera ma pobrać informacje, których żąda klient? (Zakładam, że te informacje zawarte są w żądaniu klienta)

Jeżeli moje odp. na powyższe pytania są poprawne to nasuwa mi się wniosek, że jeden program z SocketServer uruchomiony na komputerze może połączyć klienta z dowolnym serwerem, zgadza się? (przynajmniej teoretycznie, jeśli ten serwer zechce odpowiedzieć)

  1. Więc co jeśli na danym komputerze bedą działać 2 programu obsługujące SocketServer ale z rożnymi.numerami portu? Nadal wszystko bedzie działać? Dwa żądania komunikujące się przez inny port do tego samego serwera nie wejdą w konflik?

Wybaczcie, może zadaje zbyt oczywiste pytania, ale jestem totalnie zielony jeśli chodzi o technologie internetowe i chciałbym dobrze ugruntować podstawy.

0

Twój tok myślenia jest dobry. Klient łącząc się do serwera musi znać port usługi. Możesz sprawdzić że port 80 odpowiada za HTTP, a np 443 za poczte.

W TCP jest tzw. Handshake i tam negocjowe są kanały komunikacji. Klient też musi otworzyć swój port wysoki [powyzej 1024], wylosowany.

Potem w nagłówkach TCP wymieniane są wszystkoe te informacje. Żadania nie wejdą w konflikt.
Poczytaj o protokole TCP , UDP

1 użytkowników online, w tym zalogowanych: 0, gości: 1