2010-02-08 3 views
5

Nach meinem letzten Projekt hatte ich das Problem, dass der Client ein Objekt vom Server erwartet, aber während der Verarbeitung der Clients eine Ausnahme eingeben, die den Server zwingt, den Socket aus Sicherheitsgründen zu schließen.Wie man einen Socket richtig schließt, nachdem eine Ausnahme abgefangen wurde?

Das führt dazu, dass der Client auf eine sehr unangenehme Art und Weise beendet wird, indem ich dem Client nach jeder empfangenen Eingabe eine Eingangsstatusnachricht zukommen ließ, damit er weiß, ob seine Eingabe ordnungsgemäß verarbeitet wurde oder ob er sie benötigt eine Ausnahme auslösen

Also meine Frage:

  • Gibt es einen besseren/sauberere Weg, um die Steckdose nachdem eine Ausnahme gefangen zu schließen?

Antwort

2

Wenn ich richtig verstehe, haben Sie den Socket bereits von der Serverseite geschlossen, und Sie müssen Ihren Client, um dies zu realisieren und den Fehler entsprechend behandeln.

Werfen Sie einen Blick auf die Socket Dokumentation und insbesondere die setSoTimeout Methode. Wenn das Zeitlimit beispielsweise auf 5 Sekunden festgelegt ist und der Client versucht, vom Server-Socket zu lesen und keine Antwort erhält, wird das Zeitlimit überschritten und java.net.SocketTimeoutException wird ausgelöst und Sie können es abfangen und den Socket schließen.

Sie könnten auch ein ScheduledExecutorService oder ein Timer verwenden, um das Timeout zu simulieren.

2

Für Dinge wie diese:

  1. Stellen Sie sicher, in einem try/catch-Block diese Buchse Code zu setzen.
  2. Schließen Sie die Steckdose in einem "endlich". Auf diese Weise stellen Sie sicher, dass Sie den Socket sauber schließen, unabhängig davon, ob eine Ausnahme vorliegt oder nicht.
+0

Danke für Ihre Antwort, ich tue dies bereits das Problem ist, wie mit dem Client zu kommunizieren, dass sein Objekt nicht kommt? – woolagaroo

0

Sie können wirklich nicht, da der Socket geschlossen ist, können Sie auf dem Client für

java.net.SocketException: socket closed 

hören konnte, und dann würden Sie wissen, dass Sie eine Verbindung zum Server verloren.

+0

Falsch, siehe meine Antwort. Sie können nicht auf Ausnahmen "hören", und diese Ausnahme hat diese Bedeutung nicht. – EJP

1

Falsch. Diese Ausnahme tritt nur auf, wenn Sie versuchen, einen Socket zu verwenden, den Sie selbst geschlossen haben.

Worauf das OP suchen sollte, ist EOFException oder IOException: 'Verbindung zurücksetzen' oder eine SocketTimeoutException.

+0

Danke, etwas Neues gelernt. – Greg

Verwandte Themen