Estoy utilizando la comunicación Socket en una de mis aplicaciones Java. Como sé que el programa cumple una terminación anormal, los puertos de escucha no se cierran y el programa no puede iniciarse porque informa "Puerto ya abierto ..." Do Tengo de todos modos para manejar este problema? ¿Cuál es la forma general utilizada para manejar este asunto?¿Cómo cierro un puerto en caso de finalización del programa?
Respuesta
Parece que su programa está escuchando en un zócalo. Normalmente, cuando su programa sale, el sistema operativo cierra todos los sockets que podrían estar abiertos (incluidos los sockets de escucha). Sin embargo, para los zócalos de escucha, el sistema operativo normalmente reserva el puerto durante un tiempo (varios minutos) después de que el programa finalice, por lo que puede manejar cualquier intento de conexión pendiente. Puede observar que si apaga su programa de forma anormal, y luego regresa un tiempo más tarde, se iniciará correctamente.
Si desea evitar este tiempo de retardo, puede usar setsockopt()
para configurar el socket con la opción SO_REUSEADDR. Esto le dice al sistema operativo que usted sabe que está bien reutilizar la misma dirección, y no se encontrará con este problema.
Puede establecer esta opción en Java utilizando el método ServerSocket.setReuseAddress(true)
.
El sistema operativo debe manejar este tipo de cosas automáticamente, cuando el proceso de JVM ha finalizado. Sin embargo, puede haber una pequeña demora antes de que el puerto se cierre.
Como se mencionó en la Handling abnormal Java program exits, usted puede configurar un método Runtime.addShutdownHook() a acuerdos con cualquier caso especial, si realmente necesita una operación explícita.
que desea establecer la bandera SO_REUSEADDR en el zócalo
Ver http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#setReuseAddress(boolean)
- 1. ventajas de E/S del puerto de finalización y desventajas
- 2. ¿Cómo cierro un UISearchDisplayController programmatically?
- 3. ¿Qué puerto está usando un programa determinado?
- 4. ¿Cómo puedo seguir ejecutando un programa Unix en segundo plano incluso si cierro la sesión?
- 5. ¿Cómo cierro un hilo de forma segura?
- 6. Programa de terminal de puerto COM
- 7. Programa LED con solo puerto USB
- 8. confusión de la clave del puerto de terminación IO
- 9. ¿Cómo cierro correctamente una aplicación de winforms en C#?
- 10. Finalización del código Vim
- 11. ¿Cómo crear un caso de TEqualityComparer en caso de TDictionary?
- 12. Cambiar el puerto Oracle del puerto 8080
- 13. Finalización del directorio de Vim
- 14. Finalización del código del complemento NetBeans jQuery
- 15. Desasignar recursos en la finalización del proceso
- 16. ¿Cómo cierro un formulario modal justo después de abrirlo?
- 17. ¿Cómo cierro programáticamente un cuadro modal abierto de jquery.reveal.js?
- 18. ¿Cómo veo un STDOUT de un programa en ejecución de un programa perl que lo llamó?
- 19. ¿Cómo cierro los archivos de tempfile.mkstemp?
- 20. Cómo olfatear un puerto USB en Windows?
- 21. ¿Cómo cierro el servidor JBoss AS 7?
- 22. VC Dimensión del círculo, un caso especial
- 23. Finalización del código automático en VIM?
- 24. Finalización del código del depurador Xcode 4
- 25. Finalización del código Vim Java?
- 26. Cómo detectar la creación/finalización del proceso win32 en C++
- 27. Cómo especificar el puerto del cliente iperf
- 28. ¿Cómo determinar el mejor y el peor caso de un programa (algoritmo)?
- 29. Finalización del código automático en Eclipse
- 30. Cómo confirmar la finalización del comando anterior en powershell