Przeprowadziłem kilka testów z gniazdami i spotkałem się z dziwnym zachowaniem: ServerSocket odmówi połączenia po podłączeniu 50. gniazda klienta, nawet jeśli to gniazdo klienta zostanie zamknięte przed następnym otwarciem, a nawet jeśli opóźnienie jest dodawane między połączeniami.Limit połączeń Java ServerSocket?
Poniższy program jest moim eksperymentalnym kodem, który w swoim obecnym stanie nie zgłasza żadnych wyjątków i kończy normalnie. Jeśli jednak rozmiar tablicy Socket[] clients
wzrośnie powyżej 50, gniazda klienta próbujące połączyć się po 50. połączeniu zostaną odrzucone przez gniazdo serwera.
Pytanie: Dlaczego liczba 50 jest liczbą, na którą połączenia gniazda są odrzucane przez gniazdo serwera?
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(2123)) {
Socket[] clients = new Socket[50];
for (int i = 0; i < clients.length; i++) {
clients[i] = new Socket("localhost", 2123);
System.out.printf("Client %2d: " + clients[i] + "%n", i);
clients[i].close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
mam uruchomić testy, gdzie kolejne 50 gniazd połączyć się z innym lokalnym serwerze, a nie problem wystąpił z 100 gniazda są otwierane i zamykane, więc już wywnioskować, że jego gniazdo serwer odmawia połączenia, a nie niektóre ograniczenia otwierania gniazd klientów, ale nie mogłem odkryć, dlaczego gniazdo serwera jest ograniczone do 50 połączeń, nawet jeśli nie są one jednocześnie połączone.
Czy połączenia w kolejce nie zostałyby usunięte, gdy gniazda klienta są zamknięte? – Vulcan
@Vulcan Oczywiście nie. – EJP
@EJP Tak, ale dlaczego by nie?Dla mnie wydaje się dziwne, że zamknięte gniazda pozostają w kolejce do połączenia. Domyślam się, że nie ma sposobu, aby gniazdo serwera mogło wiedzieć, że gniazdo klienta zostało zamknięte. – Vulcan