2009-09-30 14 views
7

Napisałem serwer, który wykonuje nieblokującą IO przy użyciu interfejsu Java NIO API. Widzę sytuację, w której aplikacja kliencka jest niespodziewanie zamykana (na przykład z powodu utraty zasilania), a połączenie pozostaje otwarte po stronie serwera.NIO - Wykrywanie zamkniętego połączenia

Kolega napotkał ten sam problem i powiedział, że używa linii papilarnych do wykrycia tego typu rzeczy, ale mam nadzieję, że jest łatwiejszy sposób. Czy ktoś inny napotkał ten problem?

Kilka dodatkowych informacji: Mój obecny projekt serwera anuluje klucz i zamknie odpowiedni kanał, jeśli zostanie przechwycony IOException podczas próby odczytu/zapisu. Takie podejście wydaje się działać w 99% przypadków; Widziałem tylko kilka sytuacji, w których połączenie wydaje się być otwarte.

Odpowiedz

6

Bez bicia serca na poziomie aplikacji jedyną opcją jest korzystanie z protokołu TCP keepalive. Ale domyślny interwał jest bardzo długi (jak 2 godziny). RFC nie zaleca interwałów krótszych niż 2 godziny.

Można go skrócić, ale ma to charakter ogólnosystemowy. W niektórych systemach wymaga nawet przebudowy jądra, aby to zmienić.

Dlatego zaleca się bicie serca dla dowolnego protokołu opartego na protokole TCP.

+0

Dzięki ZZ Coder - Tak właśnie myślałem (obawiałem się). Jestem zaskoczony, że to nie jest funkcja TCP. – Adamski

+0

"Ping" raczej, te aplikacje nie są ludźmi - wiesz. –

Powiązane problemy