¿Cómo evitar una NoRouteToHostException?

Divulgación: el código en el que estoy trabajando es para cursos universitarios.

Antecedentes: la tarea que estoy tratando de completar es informar sobre el efecto de diferentes técnicas de subprocesamiento. Para ello, he escrito varias clases que responden a una solicitud de un cliente utilizando Java Sockets. La idea es inundar el servidor con solicitudes e informar sobre cómo las diferentes estrategias de subprocesos hacen frente a esto. Cada cliente hará 100 solicitudes, y en cada iteración estamos aumentando el número de clientes en 50 hasta que se rompa algo.

Problema: repetidamente, y consistentemente, ocurre una excepción:

Caused by: java.net.NoRouteToHostException: Cannot assign requested address
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)

Esto sucede en varios escenarios, incluso cuando el cliente y el servidor se ejecutan en localhost. Las conexiones se pueden hacer con éxito por un tiempo, es poco después de intentar conectar 150 clientes que se produce la excepción.

Mi primer pensamiento fue que podría ser el límite de Linux para los descriptores de archivos abiertos (1024), pero no lo creo. También verifiqué que todas las conexiones entre los enchufes están cerradas correctamente (es decir, dentro de unfinally bloquear).

Dudo en publicar el código porque no estoy seguro de qué partes serían las más relevantes, y no quiero tener una lista enorme de código en la pregunta.

¿Alguien ha encontrado esto antes? ¿Cómo puedo evitar la excepción NoRouteToHostException?

EDITAR (otras preguntas están en cursiva)

Algunas buenas respuestas hasta ahora que apuntan al rango de puerto efímero o al RFC 2780. Ambos sugerirían que tengo demasiadas conexiones abiertas. Para ambos, parece que el número de conexiones que se deben hacer para alcanzar este límite sugiere que en algún momento no estoy cerrando las conexiones.

Habiendo depurado el cliente y el servidor, se ha observado que ambos llegan a la llamada del métodomyJava-Net-SocketInstance.close(). Esto sugeriría que las conexiones se están cerrando (al menos en el caso no excepcional).¿Es esta una sugerencia correcta?

También,¿hay que esperar un nivel de sistema operativo para que los puertos vuelvan a estar disponibles? Sería una posibilidad ejecutar el programa una vez por separado para cada uno de los más de 50 clientes si solo fuera necesario un período corto (o de manera optimista, ejecutar un comando) antes de ejecutar el siguiente intento.

EDITAR v2.0

Habiendo tomado las buenas respuestas proporcionadas, modifiqué mi código para usar el método setReuseAddress (true) con cada conexión de Socket realizada en el cliente. Esto no tuvo el efecto deseado, y todavía estoy limitado a 250-300 clientes. Después de que el programa termina, ejecuta el comandonetstat -a muestra que hay muchas conexiones de socket en el estado TIME_WAIT.

Mi suposición era que si un socket estaba en elTIME-WAIT estado, y se había establecido con elSO-REUSEADDR opción, cualquier nuevo zócalo que intente usar ese puerto sería capaz de hacerlo, sin embargo, todavía estoy recibiendo la excepción NoRouteToHostException.

¿Es esto correcto? ¿Hay algo más que se pueda hacer para resolver este problema?

Respuestas a la pregunta(6)

Su respuesta a la pregunta