2010-09-16 9 views
11

Podczas korzystania z klasy Socket 1 nawiązuje się połączenie TCP z serwerem na pewnym porcie, ale na serwerze ServerSocket jest w stanie obsługiwać wiele połączeń klientów dla każdego żądania przyjęcia i delegować je do wątku, aby obsłużyć żądanie. Ale w jaki sposób klasa ServerSocket może akceptować wiele połączeń TCP na tym samym porcie.W jaki sposób klasa serwerocket obsługuje wiele połączeń klientów na tym samym porcie?

Czy oznacza to, że system operacyjny decyduje o liczbie dozwolonych połączeń lub maksymalnym dozwolonym zaległościach i czy może być kontrolowany przez aplikacje na systemie operacyjnym (mam na myśli to, że Java jest ograniczona przez maksymalny backlog obsługiwany przez OS) i czy istnieje jakakolwiek prywatność dla zaległych połączeń w specyfikacji TCP?

Najlepsze reagards,
Keshav

+0

Patrz np [ta odpowiedź] (http://stackoverflow.com/questions/3638953/do-tcp-connections-get-moved-to-another-port-after-they-are-opened/3639017#3639017) na Stackoverflow. –

Odpowiedz

8

połączenie TCP jest zdefiniowane przez unikalny zestaw (źródłowego adresu IP, port źródłowy, docelowy IP, docelowy port). Ponieważ serwer wiąże się z określonym portem, definiuje dwie z tych czterech zmiennych. Tak długo, jak wszyscy klienci pochodzą z różnych adresów IP i/lub różnych portów, nie będzie to problemem.

I tak, system operacyjny może kontrolować, ile łącznych połączeń jest dozwolonych, a program może ograniczyć to jeszcze bardziej.

+0

Czy to oznacza, że ​​możemy mieć * nieskończone * połączenia, a nie tylko 65k? – Pacerier

+0

Nie bez ograniczeń, ale wyczerpanie kombinacji IP/sport/dport nie będzie czynnikiem ograniczającym. – zigdon

+0

Czy to prawda, że ​​komputer próbujący się połączyć ze sobą może mieć teoretyczny limit 65536 * 65536 = 4294967296 połączeń z samym sobą? A może zepsułam moją matematykę? – Pacerier

-1

System operacyjny, na którym działa serwer, używa zdalnego numeru portu do rozróżnienia różnych połączeń z serwerem.

+0

Używa 4-tki. – EJP

3

Obsługuje wielu klientów i można wybrać liczbę klientów, którzy będą obsługiwać w tym samym czasie.

Połączenie (aka Socket między klientem a serwerem jest nie tylko wskazane przez AdresIPSerwera/ServerPort, jest utożsamiany z ClientIP/ClientPort/AdresIPSerwera/ServerPort.

Musisz tylko akceptować połączenia (i zazwyczaj traktują je w różnych wątkach).


domyślnie wielkość zaległości jest 50, ale można ją ustawić podczas tworzenia ServerSocket.

new ServerSocket(21, 100); //Create a server socket with a backlog of 100 

Materiały:

+0

Nie sądzę, że możesz kontrolować 'zaległości', możesz to określić, ale nie możesz tego kontrolować, jeśli myślisz, że możesz i drugi argument konstruktora działa, wtedy możesz chcieć rzucić okiem na to moje pytanie - http ://przepełnienie stosu.com/questions/41309474/having-issue-with-testing-backlog-as-per-serverocketint-port-int-backlog – hagrawal

Powiązane problemy