2010-02-08 23 views
5

Po ostatnim projekcie miałem problem, że klient oczekiwał obiektu z serwera, ale podczas przetwarzania klientów wprowadzono wyjątek, który zmusza serwer do zamknięcia gniazda z powodów bezpieczeństwa.Jak prawidłowo zamknąć gniazdo po wychwyceniu wyjątku?

To powoduje, że klient kończy pracę w bardzo nieprzyjemny sposób. Sposób, w jaki zdecydowałem się rozwiązać ten problem, polegał na wysłaniu klientowi komunikatu o stanie wejścia po każdym otrzymanym wejściu, aby wiedział, czy jego dane wejściowe zostały przetworzone prawidłowo lub czy potrzebuje rzucić wyjątek.

Więc moje pytanie:

  • Czy jest lepiej/bardziej przejrzysty sposób, aby zamknąć gniazdo po wyjątek zostanie złapany?

Odpowiedz

2

Jeśli dobrze rozumiem, zamknąłeś już gniazdo od strony serwera i potrzebujesz klienta, aby to zrozumieć i odpowiednio rozwiązać problem.

Zapoznaj się z dokumentacją Socket, w szczególności z metodą setSoTimeout. Na przykład, jeśli limit czasu jest ustawiony na 5 sekund, a klient próbuje odczytać dane z gniazda serwera, a nie otrzyma odpowiedzi, upłynie limit czasu i zostanie podniesiona wartość java.net.SocketTimeoutException, którą można przechwycić i zamknąć gniazdo.

Do symulacji limitu czasu można również użyć funkcji ScheduledExecutorService lub Timer.

2

Na takie rzeczy:

  1. Upewnij się umieścić ten kod gniazdo wewnątrz bloku try/catch.
  2. Zamknij gniazdo w "końcu". W ten sposób upewnisz się, że zamkniesz gniazdo bez względu na to, czy jest wyjątek, czy nie.
+0

Dzięki za odpowiedź, już to robię, to jak przekazać klientowi, że jego obiekt nie nadchodzi? – woolagaroo

0

Naprawdę nie może ponieważ gniazdo jest zamknięte, można słuchać na kliencie za

java.net.SocketException: socket closed 

i wtedy będzie wiedział, że stracił połączenie z serwerem.

+0

Niepoprawnie, zobacz moją odpowiedź. Nie można "słuchać" wyjątków, a ten wyjątek nie ma takiego znaczenia. – EJP

1

Niepoprawnie. Ten wyjątek występuje tylko wtedy, gdy próbujesz użyć gniazda , które zamknęło się:.

To, czego powinien PO szukać, to EOFException lub IOException: "reset połączenia" lub wyjątek SocketTimeoutException.

+0

Dzięki, nauczyłeś się czegoś nowego. – Greg

Powiązane problemy