Socket Socket Verbindung wiederherstellen

Stroker89

Bekanntes Mitglied
Hallo,

ich habe eine Android App (Client) und einen Konsoloenprogramm (Server) die miteinander per Sockets kommunizieren.
Die Verbindung ist bidirektional und funktioniert soweit einwandfrei.

Jetzt zu meiner Frage:
Angenommen Client verliert kurzzeitig seine Internetverbindung, gibt es dann eine Möglichkeit dass der Server das merkt und ein erneutes Verbinden auf diesem Socket zulässt, ohne dass man der Socket auf der Serverseite neu erstellen muss.

Jeder Socket läuft auf dem Server in einem eigenen Thread. Wird der Socket vom Client geschlossen, so wird auch der Thread beendet.

Gruß Martin
 

Stroker89

Bekanntes Mitglied
Das gestaltet sich eher als schwer, da der Client sich verbindet sobald die App startet und sich erst wieder verabschiedet, wenn die App geschlossen wird. Das neu Verbinden gestaltet sich also nicht ganz so einfach...
 

TKausL

Top Contributor
Wenn sich die Internetverbindung trennt fliegt beim Lesezugriff normalerweise eine Exception. Diese kannst du dann eben behandeln indem du neu verbindest.
 
T

trööhööt

Gast
ich denke die frage zielt eher darauf ab ob es möglich wäre bei verlust der verbindung diese zu re-etablieren als ob diese nie getrennt gewesen wäre ...

an sich ist das so nicht direkt möglich ...

ein lösung wäre das sowohl client als auch server ihre daten in einem speziellen objekt halten was für die kommunikation zu ständig ist ...

bricht nun die verbindung ab kann man ein timeout verwenden nach dem dann endgültig gesagt wird "verbindung unterbrochen" ...
kann aber während dieser zeit die verbindung wieder hergestellt werden (also der client baut eine neue TCP-verbindung zum server auf) muss der server anhand von header daten prüfen ob es dazu ein objekt gibt und gibt dann an das noch "laufende" objekt einfach den neuen socket / die neuen streams ...

der client merkt davon nichts da dieser nur anfragen gegen das verbindungs-objekt richtet was innerhalb des timeouts die daten einfach in einen buffer schreibt und bei erfolgreicher wiederherstellung einfach sendet ...
sowohl server als auch der client müssen dann lediglich so ausgelegt sein das beim read() nicht direkt eine exception kommt (oder zumindest nicht gleich weitergereicht wird) sondern erstmal während des timeouts (bzw bis zu dessen ablaufen) versucht wird die verbindung wieder aufzubauen und erneut read() auszuführen ...

in wie weit java einem da mit der api hilft weis ich jetzt nicht aus dem kopf ... aber ich denke wenigstens etwas, nämlich die zuordnung einer neuen verbindung zu einem bestehenden objekt, muss man schon selbst basteln ...


an sich also grob gesagt : ja, wäre schon so möglich, müsste man aber einiges selbst implementieren
 

Bernd Hohmann

Top Contributor
Wenn mit Verbindungsunterbrechungen öfters zu rechnen ist, dann würde ich das wie ein "Pseudo-Semipermanentes Pseudo-Stateless Protokoll" (also ähnlich wie HTTP mit KeepAlive) implementieren.

1) Client kommt an, bekommt eine Session-ID zugewiesen

2) Unter dieser Session-ID speichern Client wie Server die notwendigen Daten lokal

3) Bei der Kommunikation wird immer die Session-ID als erstes Übertragen, dann der Rest der Daten.

3) Bricht die Verbindung ab, wird sie einfach neu aufgemacht und mit der die alten Session-ID weitergearbeitet.

Alles natürlich nicht ganz trivial, da Du aber dein eigenes Protokoll definieren kannst wirds nicht ganz so brutal wie bei HTTP.

Bernd
 
T

trööhööt

Gast
gut ... mit dauer-polling würde es auch gehen ... aber du hast einiges vergessen

1) mit deiner lösung wäre der server nicht in der lage a-synchron zum poll des clients diesem daten zu schicken ... vielleicht ist dies aber erwünscht / notwendig ...
man könnte es zwar so regeln das der server auf den nächsten poll wartet ... aber wenn realtime nötig ist scheidet das aus ...
außerdem sollte man eine permanente verbindung einem polling vorziehen

2) erhöter traffic durch overhead und geschwindigkeits-engpässe
wenn man alleine den overhead nimmt den es kostet immer wieder eine verbindung neu aufzubauen und wieder zu trennen kommt man über einen gewissen zeitraum auf ne ganze menge "datenmüll"
ist zwar in der heutigen zeit zu vernachlässigen ... aber dennoch sollte man sowas nicht unbedacht lassen ... vor allem wenn es um mobile geräte geht bei denen nicht sichergestellt werden kann wie wofür gezahlt wird ... denn nicht jeder hat eine flatrate
außerdem würde die geschwindigkeit aufgrund TCP Slow Start leiden ... wofür ja als gegenmaßnahme extra mit HTTP/1.1 KeepAlive eingeführt wurde ... um mal bei deinem beispiel zu bleiben ...

3) sollte man polling nutzen stünde man immer noch vor dem problem des verbindungs-abbruches ...
wenn die verbindung weg ist bevor der poll beginnt fängt man dies einfach ab und wartet den zyklus bis zum nächsten ab ...
was aber wenn die verbindung genau während der daten-übertragung wegbricht ? ergebnis : man steht wieder am anfang des problems und hat sich sinnloser weise damit beschäftigt sein system von einer permanent verbindung in eine polling-geschichte umzubauen ...

an sich ist die idee für die low-level schicht nicht ganz verkehrt ... aber doch einfach zu allgemein und für das einsatzgebiet von TO dann doch eher weniger geeignet
 

Stroker89

Bekanntes Mitglied
Also die Kommunikation findet bidirektional statt. Eine weitere Anforderung ist, dass der Server mehrere tausend Verbindungen gleichzeitig verwalten muss. Auch soll die Kommuikation via XML statt finden, also ein eigenes Protokoll. Da wären wir auch schon beim nächsten Problem...
Hab damit leider gar keine Erfahrung...:-(

Gruß Martin
 

TKausL

Top Contributor
Vieleicht erzählst du erstmal was du so vorhast. Ich Bezweifle dass XML die beste Lösung ist, kommt aber immernoch drauf an was geplant ist.
 

Stroker89

Bekanntes Mitglied
Die Vorgabe ist eine XML Kommunikation über Sockets. Die Verbindung passt jetzt soweit. Ob eine wiederverbindung der Clients später implementiert wird ist noch nicht klar, da es eine sehr sicherheitskritische Anwendung wird.

Das wiederherstellen einer Verbindung hat mich nur rein technisch interessiert ob sowas überhaupt möglich wäre.

Die einfache Kommunikation über Strings steht bereits, also der Server behandelt mehrere Clients sehr gut (Threads leben nur so lang wie die Verbindung steht). Client ist eine Android App.

Mein Problem ist jetzt vorrangig das XML Protokoll und wie ich es implementiere.
Mir stellen sich momentan so Grundsatzfragen wie z. B. wie speichern die Teilnehmer den Status der Verbindung. Also an welcher Stelle der Kommunikation sich die Teilnehmer befinden. Wie sehen dazu Best Practises aus. Man findet leider nur sehr spärliche Informationen im Netz zu diesem Thema.

Gruß Martin
 

Stroker89

Bekanntes Mitglied
Ich weiß dass XML kein Protokoll ist ich meinte damit auch das XML basierende Protokoll das ich entwerfen und entwickeln soll.

@Bernd: Könntest du mir das bitte erklären?
 

Bernd Hohmann

Top Contributor
@Bernd: Könntest du mir das bitte erklären?

Die Daten innerhalb von Android sind nicht sonderlich gut bis garnicht gegeneinander abgeschirmt. Sollte Deine App also Daten auf der "internen Festplatte" des Telefons ablegen kann das durch andere Apps problemlos gelesen werden (sofern der Benutzer zugestimmt hat - und wer macht das nicht?).

Eine fehlerfreie, permanente Datenübertragung via GPRS/UMTS/Sonstwas mit einem Mobiltelefon ist so einfach wie Fliegen mit Esstäbchen zu fangen. Ausserhalb dieser kleinen Alleskönner kann man das mit VPN (zb. OpenVPN) regeln welche den Socket über längere Zeit quasi freischwebend und blockierend auflassen können bis man wieder connected hat. Gibts auch für Android, aber dazu muss man root werden und das geht im Standard nicht.

Ich halte Android für ein nettes OS auf dem Sachen laufen mit denen ich mir im Wartezimmer eines Arztes die Zeit vertreiben kann. Vitale Daten würde ich darauf nicht publizieren, im Rufnummernspeicher hab ich nur die Nummern meiner Feinde.

Bernd
 

Stroker89

Bekanntes Mitglied
Auf dem Gerät selber werden keine Daten gespeichert außer eine Art Benutzername. Sämtliche Daten bekommt das Gerät vom Server. Selbst einen Großteil der Config. Diese App wird ohne Internetzugang gar nicht benutzbar sein.

Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
F Einfache Socket Verbindung Netzwerkprogrammierung 2
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Socket Verbindung unterbrochen --> keine Exception Netzwerkprogrammierung 7
P Socket neuer Client - neue(r) Socket/Verbindung geöffnet? Netzwerkprogrammierung 6
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
Y server client socket verbindung übers internet aufbauen Netzwerkprogrammierung 8
F Socket Socket Verbindung Netzwerkprogrammierung 10
N Verbindung zu Fritzbox Socket/Telnet ??? Netzwerkprogrammierung 5
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
T Mac Adresse über Socket Verbindung abfragen? Netzwerkprogrammierung 9
O TCP Socket-Verbindung überprüfen Netzwerkprogrammierung 4
J close() Socket Verbindung nötig ? Netzwerkprogrammierung 3
C Verbindung zum Server prüfen mit einem vorhandenem Socket Netzwerkprogrammierung 4
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
G Socket - Verbindung zustandegekommen? Netzwerkprogrammierung 2
R Socket-Verbindung beschleunigen Netzwerkprogrammierung 5
H Byte-Codierung bei Socket-Verbindung ändern Netzwerkprogrammierung 8
I IP Adresse des Clients einer Socket Verbindung Netzwerkprogrammierung 2
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
G Socket Socket Kommunikation Netzwerkprogrammierung 1
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
A TCP multiClientServer mit socket mittels ObjectOutputStream Netzwerkprogrammierung 12
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
E Socket Frage Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
T Socket Socket connections schließen? Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
F Socket Socket in anderen Methoden Netzwerkprogrammierung 1
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
I Socket Netzwerkprogrammierung 1
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
Joew0815 socket event handler Netzwerkprogrammierung 2
A Socket Socket Receive-/SendBuffersize Netzwerkprogrammierung 0
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
B SSL Socket Netzwerkprogrammierung 2
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
S Socket SSL Socket und Sun/Oracle Java Netzwerkprogrammierung 5
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
C Socket Systemsperren mit Socket Netzwerkprogrammierung 4
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
A UDP verlorene Pakete/ socket.receive zu langsam Netzwerkprogrammierung 27
CookieSoft Socket Packet per Socket Netzwerkprogrammierung 8
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Per Socket auf POP3 zugreifen? Netzwerkprogrammierung 7
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T Socket String zu Socket Netzwerkprogrammierung 26
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
C Socket Socket: Connection timed out Netzwerkprogrammierung 3
T Socket blockierter Socket Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben