Korzystam z kodu Java na CentOS 5
java Something.java &
który tworzy gniazdo na określonym porcie .... powiedzmy 9090
.. jednak kod nie działa całkowicie, więc ja Ctrl-C
z tego.
Gdy próbuję ponownie uruchomić program, wyświetla się komunikat o błędzie informujący, że nie można połączyć się z portem 9090
.
Kiedy zmieniam numer portu na jakąś dowolną rzecz 9010
... wszystko działa ponownie (oprócz tego, że Something.java
utknie) .... odejść i powtórzyć
Co się dzieje? Chciałbym móc używać jednego spójnego portu do tych rzeczy ... czy jest jakiś proces w tle, którego nie pozbywam się za każdym razem?
Dzięki!
Odpowiedzi:
2 dla odpowiedzi № 1Może się tak zdarzyć, ponieważ system operacyjny ma pewne opóźnienie kwarantanny, zanim inny proces może ponownie użyć adresu.
Biblioteka C udostępnia opcję gniazda SO_REUSEADDR
które można ustawić, aby tego uniknąć. Wskazuje na to szybkie wyszukiwanie w Internecie setReuseAddress(boolean)
w java.net.ServerSocket
można użyć do ustawienia tej opcji.
0 dla odpowiedzi nr 2
JVM może zająć trochę czasu, aby zakończyć program i zwolnić gniazdo.
Możesz ręcznie zamknąć gniazdo, gdy oprogramowanie jest zakończone przez ctrl-c za pomocą Runtime.getRuntime().addShutdownHook(...)
, które bardzo polecam dla wszystkich programów działających w tle i korzystających z gniazd. Powinno pomóc.