# Verständnisfrage Verfügbarkeit Socketverbindung



## franconian_dude (21. Sep 2011)

Hallo,

ich habe ein kleines (Verständnis) Problem mit Sockets.

Ich habe einen Server und mehrere Clients. Die Clients verbinden sich beim Starten der Clientanwendung automatisch mit dem Server und warten von diesem auf Befehle - also sog. Push-Technologie eingebaut, weil ich explizit Pull-Technologie (Polling) von Seiten der Clients vermeiden wollte.

Problem ist aber, wenn der Server nicht ordnungsgemäß beendet wird - alle Socket-Connections werden nicht explizit geschlossen - dann bekommen die Clients das nicht mit und warten "schön brav" weiter auf Anweisungen vom Server obwohl dieser schon down ist. Wenn dieser dann wieder hoch fährt, ändert sich nix bei den Clients, denn die warten einfach auf Anweisungen, welche aber der neu gestartete Server nicht mehr senden kann, weil er die vorherigen Verbindung nicht kennt.

OK, es ist schon richtig, dass der Server immer ordnungsgemäß heruntergefahren werden soll, aber wie wir wissen, passieren ja immer die unmöglichsten Umstände. 
Ich habe jetzt einen Workaround eingebaut, der mich aber nicht in Ruhe lässt.
Ich polle jetzt alle paar Sekunden mit jedem Client den Server an, sende ein Ping und wenn der Server down ist, dann wird die Verbindung geschlossen, somit ist sichergestellt, dass sich die Clients automatisch wieder anmelden beim Server, wenn der wieder verfügbar ist.

Jetzt meine Frage. Ist diese Vorgehensweise der einzige Ausweg? Ich wollte polling vermeiden und musste es doch wieder einbauen. 

Gibt es eine andere Lösung?
Vielen Dank für etwaige Antworten schon einma im Voraus.


----------



## SlaterB (21. Sep 2011)

wenn die Sockets bei Programmende nicht ordentlich geschlossen werden, was ich mir kaum vorstellen kann,
ist es letztlich ein Hardware- bzw. Betriebssystem-Problem, was soll Java dazu noch sagen, 
wenn ein Programm aus ist ist einfach nichts mehr zu tun da

sind die Sockets danach auch bis Betriebssystem-Neustart gesperrt falls nicht der Client noch aktiv wird?..

was passier eigentlich bei Netzausfall, viel wahrscheinlicher? das kannst du ja nun wirklich nicht auch noch Java anhängen,
wozu ist eigentlich die dauerhafte Verbindung nötig, wenn du nicht pollen willst, reicht es dann nicht erst bei nächster Verwendung nachzuschauen oder ähnliches?


----------



## franconian_dude (21. Sep 2011)

Hallo SlaterB,

mit ordnungsgemäß schließen meinte ich, wenn auf dem Server ein unerwarteter Fehler auftritt oder man einfach so das Konsolenfenster schließt (oder STRG+C), dann werden die nicht ordnungsgemäß geschlossen - sollte ja nicht passieren, aber es passieren nun mal viele Sachen, die nicht passieren sollen.
Wenn ich die explizit schließe, dann passt schon alles, da habe ich keine Probleme.

Nur, jetzt stelle man sich vor, man hat zig Clients verbunden und schließt mal ausversehen Konsolenfenster und die Sockets werden nicht ordnungsgemäß getrennt.
Dann hab ich ein großes Problem, denn zur Not müsste ich dann jeden Client explizit neu starten, da diese ja noch mit dem Socket verbunden sind und auf Nachrichten vom Server warten.

Also musste ich Polling einbauen. Wenn ich polle und Server ist nicht da, bekomme ich Exception, die ich handle und dann weiß ich, dass ich neue Connection aufbauen muss.
Polle ich nicht, dann bleiben die Eigenschaften, bound, connected ect. auf true und zwar "ewig".

Die Verbindung muss offen bleiben, da es sich hier um sehr zeitkritische Nachrichten vom Server handelt und die Clients dann auf Accounts (bei denen die dauerhaft angemeldet sein müssen) Transaktionen ausführen müssen.

Gruß


----------



## SlaterB (21. Sep 2011)

die ersten zwei Drittel deines Postings scheinen nur Wiederholung des ersten zu sein, nebenbei bemerkt,
ich hab das schon verstanden, Server aus, Clients noch an

viel neues habe ich leider auch nichts zu sagen, nur noch eine Bemerkung
> um sehr zeitkritische Nachrichten vom Server handelt 
reicht es für den Client nicht, nach x Sekunden ohne Nachricht vom Server abzubrechen, macht der Server nicht schon das Polling?


----------



## franconian_dude (21. Sep 2011)

Naja, ich habe mit dieser Thematik in der Vergangenheit nicht sehr viel gemacht.

Problem ist doch, dass beim Read des Socketstreams die Anwendung blockiert, das bedeutet, der Client "hängt da irgendswie fest" in der Programmzeile und wartet auf Nachrichten vom Server.

Aber habe echt keine Netzwerkausfälle bedacht, die auf jeden Fall natürlich auftreten werden, dann macht ja das Polling auch wieder Sinn.

Jetzt noch mal anders gefragt. Ist die Vorgehensweise mit Polling eigentlich usus? Macht man das dann eher doch so?

Also der Server kann auch mal mehrere Stunden (Tage?) keinen Auftrag für einen Client haben, aber wenn einer vorhanden ist, dann ist das sehr zeitkritisch (Stichwort Authentifizierung Client <-> Server soll nicht dann nochmal angetriggert werden, da Zeitverlust)


----------



## SlaterB (21. Sep 2011)

> Problem ist doch, dass beim Read des Socketstreams die Anwendung blockiert
worauf beziehst du dich, auf das Pollen, eine normale Nachricht, mit oder ohne Ausfall? usw., mit welchem Ziel?
wie auch immer, wenn das so kritisch ist, kann ja nebenher ein zweiter Thread laufen, der je nach Status dann z.B. den Socket schließt,
ein Timeout zu verwenden, welches das Blockieren nach x Sekunden unterbricht, kommt wohl auf dasselbe hinaus

> wenn einer vorhanden ist, dann ist das sehr zeitkritisch
tjaja, dann wohl wirklich pollen, auch wenn evtl. einmal alle 5 Min. reicht,
wenn der Server schon ausfällt und neustarten muss und alle Clients ebenso neue Verbindung aufbauen dauert das doch sicher eh gewisse Zeit,

na, ich kann eigentlich nicht behaupten, da das Übliche zu kennen, vielleicht antwortet noch wer anders

edit:
kommt eigentlich eine umgekehrte Verbindung in Frage? die jetztigen Clients können sich ja gerne initial beim Server melden,
aber wenn der danach der aktive ist, könnte der dann selber als Client die Verbindung zu vielen Mini-Servern aufbauen?


----------

