Frage von TechnoObi, 33

Java -> Socket Connection überprüfen?

Guten Tag,

ich möchte eine Socket-Verbindung zwischen meinem Server und meinem Android Handy erstellen. Bzw. die Android Handys mit der App. Nun habe ich aber ein Problem, und dafür auch im Internet nicht wirklich etwas gutes gefunden.

Wie kann ich richtig überprüfen, ob die Connection noch steht? Oder etwasausführen, wenn ich vom Client etwas sende, aber es nicht ankommt? Z.B.: wenn der Client kein Internet hat, der Server nicht erreichbar ist, oder ähnliches.

Natürlich gilt das auch Serverseitig. Ich setze alle Socket-Verbindungen in eine HashMap, damit ich auf diese zugreifen und Nachrichten senden kann. Und wenn dieser nicht vertreten ist, ihn wieder löschen.

Danke für Antworten und Liebe Grüße!

Antwort
von androhecker, 21

Je nach dem wie dein Protokoll arbeitet (Byte Arrays, pure String oder Pakete) schickst du damit einen sogenannten Heartbeat (Zyklus kannst du selber wählen), wenn die jeweilige Seite einen bestimmten Zeitraum keinen Heartbeat bekommen hat, wird der Socket entfernt.

Kommentar von TechnoObi ,

Ich sende pure Strings mit Data Input/Output Stream. Gibt es da auch so etwas? 

Kommentar von androhecker ,

Dann musst du einen bestimmen Zeichencode senden, welcher nur dazu dient und nicht weiter behandelt wird. Wenn du wirklich nur rohe Nachrichten (wie Chat Nachrichten) sendest, könnte das eben ein Problem werden, weil eine Nachricht diesen Code enthalten könnte. Wenn das der Fall ist, gibst du den Nachrichten einfach noch einen Prefix aus einem einzelnen Charakter, der den Inhalt angibt.

Expertenantwort
von KnusperPudding, Community-Experte für Java, 27

Auch wenn du bereits geschildert hast, dass du nur Strings überträgst, so würde ich dennoch gerne aus einem Praxis-Beispiel auf ein Beispiel mit ObjectInputStreams verweisen.

Auf der Seite des Servers würde das beispielsweise so aussehen:

In der Methode in des Servers, welche die Anfragen eines Clients annimmt hätten wir beispielsweise grob folgenden Code:

ServerSocket ss = ...
Socket cs = ss.accept();
...

ObectInputStream in = new ObjectInputStream(cs.getInputStream());

try { for (Object inputObject; (inputObject = in.readObject()) != null;) { .... } } catch (IOException e) { ... }

Wird eine IOException hier ausgelöst, so gilt die Verbindung zum Client als getrennt. - In der IOException kann es zu folgenden möglichen "Exceptions" kommen:

EOFException: der InputStream wurde geschlossen. Passiert wenn ich der Client regulär abmeldet

SocketException: Es ist ein Fehler aufgetreten den Socket anzusprechen. Passiert wenn die Verbindung unabsichtlich verloren geht.

Clientseitig ist das ähnlich:

try {
    Socket socket = new Socket(ip, port);
    InputStream inputStream = socket.getInputStream();
ObjectInputStream in = new ObjectInputStream(inputStream); while ((inputObject = in.readObject()) != null) { .... } } catch (IOException e) { ... }

Auch hier würde eine Exception auftreten wenn die Verbindung zum Server verloren gehen würde.

Fazit: Wenn der eingehende Kanal "zusammen bricht", weißt du, dass die Verbindung getrennt ist. - Das gilt Server und Client. 

Ein Lösungsansatz wäre entsprechend: Nach dem Try/Catch Block Code auszuführen, der dir bestätigt, dass die Verbindung beendet wurde.

Keine passende Antwort gefunden?

Fragen Sie die Community