2012-06-05 12 views
28

Mam aplikację na Androida, która rozmawia z programem na komputerze. Używam klasy Socket Android (Java). Jeśli zatrzymam się i zrestartuję aplikację na PC, gdy następnym razem wyślę coś z Androida, otrzymam wyjątek IO "Broken Pipe". Moje pytanie nie dotyczy tego. Oto pytanie:Co dokładnie oznacza wyjątek "zepsuta rura" dla gniazda?

Po zdobyciu złamaną wyjątku rury jeśli kwerendy gniazdka za isClosed() metoda zwraca false (czyli nie jest zamknięta), a jeśli kwerendy gniazdka za isconnected() metoda zwraca prawda, to znaczy, że jest podłączony. Czy ktoś mógłby mi wyjaśnić te wyniki? Z góry dziękuję!

+0

http://stackoverflow.com/a/3751722/776244 –

+0

Samir, ten link dotyczy tego, co oznacza wyjątek z powodu złamanej rury. Już to rozumiem; dlatego powiedziałem, że moje pytanie nie dotyczy tego. Chcę zrozumieć wartości zwracane, które otrzymuję z dwóch metod Socket. Zaktualizowałem tytuł, aby to wyjaśnić. – user316117

Odpowiedz

18

Złamana rura oznacza dokładnie to, o czym tu mówisz. Program po twojej stronie wciąż ma otwarte gniazdo, ale gniazdo po drugiej stronie nie jest już w komunikacji i nie przechodzi przez standardową procedurę "close pipe". Może się to zdarzyć, jeśli druga strona nagle straci moc, jeśli fizyczna linia zostanie odcięta, czy coś w tym rodzaju. W związku z tym lokalnie gniazdo rejestruje się zarówno jako otwarte, jak i połączone - jest po prostu podłączone do zepsutej rury. Czy chciałbyś tu uzyskać jakieś praktyczne porady, czy tylko teorię?

+0

Chciałem zrozumieć odpowiedź Gniazda, aby dowiedzieć się, czy jest coś, co mogę zapytać o gniazdo, aby wiedzieć, kiedy straciłem swój kanał komunikacyjny, a te wydawały się dwiema najbardziej prawdopodobnymi metodami. Czy to oznacza, że ​​gdy rura złamie pierwszą wskazówkę, którą będę miał, ląduje w części "catch" bloku "try-catch", kiedy coś wysyłam? – user316117

+0

prawie. Punktem złamanej fajki jest to, że nie dzieje się to lokalnie, a twój system nie został poinformowany, że to się dzieje, kiedy to się stało. –

+0

Mam króla podobnego problemu, proszę spojrzeć na ten post http://stackoverflow.com/questions/34728935/android-local-video-server – chandil03

1

Socket.isClosed() i Socket.isConnected() tylko powiedzieć, co ty zrobili do gniazda . Nie można tam nic powiedzieć o stanie połączenia . Nie zamknąłeś gniazda: jest otwarty. Podłączyłeś gniazdo: jest połączone.

Po uzyskaniu dowolnego numeru IOException po uruchomieniu innego niż SocketTimeoutException lub limitu czasu połączenia należy zamknąć gniazdo.

Powiązane problemy