Kluczowe słowo tutaj: (without closing the socket properly)
.
gniazda powinny być zawsze nabyte i unieszkodliwiane w ten sposób:
final Socket socket = ...; // connect code
try
{
use(socket); // use socket
}
finally
{
socket.close(); // dispose
}
Nawet z tym środki ostrożności należy określić limity czasu aplikacji, specyficznych dla danego protokołu.
Moje doświadczenie pokazało, że niestety nie można niezawodnie korzystać z żadnej funkcji limitu czasu gniazda (np. Nie ma limitu czasu na operacje zapisu, a nawet operacje odczytu mogą czasami trwać wiecznie).
Dlatego potrzebny jest wątek watchdog, który wymusza limity czasu aplikacji i unieszkodliwia gniazda, które przez jakiś czas nie reagowały.
Jednym z wygodnych sposobów robienia tego jest inicjowanie Socket i ServerSocket za pośrednictwem odpowiednich kanałów w java.nio. Główną zaletą takich gniazd jest to, że są one Przerywalne, w ten sposób można po prostu przerwać wątek, który wykonuje protokół gniazda i upewnić się, że gniazdo jest odpowiednio ułożone.
Należy zauważyć, że należy wymuszać limity czasu aplikacji po obu stronach, ponieważ jest to tylko kwestia czasu i nieszczęścia, kiedy mogą wystąpić niewrażliwe gniazda.
Próbowałem już użyć go, pisząc do gniazda, a nawet wtedy nie wiem, czy klient się rozłączył. – erotsppa