Zeitspanne für erneutes senden

Lord_Aratorn

Aktives Mitglied
Hey, ich habe grade ein ziemliches Loch im Kopf.
Ich habe ein Client-Server System. Sowohl Client als auch Server laufen in ihrem eigenen Thread und übermitteln sich gegenseitig Nachrichten.
Nun Möchte ich sicherstellen, dass ein Packet, wenn es nicht innerhalb einer gewissen Zeitspanne vom Server beantwortet wird, erneut gesendet wird.
Und nun die doofe Frage, wie kann ich dies in der run-Method des Clientthreads realisieren?

Meine idee ist: ich könnte die SystemZeit (System.currentTimeMillis() ) nehmen, wenn der client das packet aussendet. Während jeder Iteration in der run-Method überprüfen, ob Altezeit+Wartezeit < Aktuelle Zeit ist, und wenn dem nicht so ist, abermals das Packet senden.

Ich finde diese Lösung recht unschön und denke, dass es bestimmt eine schönere Möglichkeit gibt, des selben Sachverhalt zu realisieren.
 
Zuletzt bearbeitet:

agentone

Bekanntes Mitglied
Welches Protokoll verwendest du? TCP oder UDP?

Bei TCP gehen keine Pakete verloren oder verschwinden im Nichts. Das wird automatisch geregelt. Bei UDP allerdings kann es durchaus passieren, dass Pakete verschwinden oder leicht verändert ankommen. Dafür ist der Header von UDP kleiner, man hat also deutlich weniger "Schrott", der "umsonst" mitgeführt wird.
 

Michael...

Top Contributor
Meine idee ist: ich könnte die SystemZeit (System.currentTimeMillis() ) nehmen, wenn der client das packet aussendet. Während jeder Iteration in der run-Method überprüfen, ob Altezeit+Wartezeit < Aktuelle Zeit ist, und wenn dem nicht so ist, abermals das Packet senden.
Wenn mehrere Pakete hintereinander geschickt wurden, wird ja jedesmal die alte Zeit neu gesetzt, wie willst Du dann mitbekommen, dass ein Packet zwischen drin verloren gegangen ist?

Hab zwar nicht viel Ahnung davon, aber ich würde sagen, Du brauchst ein Protokoll mit entsprechendem Header, welcher eine Paket ID enthält, beim versenden speicherst Du diese ID mit dem Paket und der Sendezeit in einer Liste. sobald der Server ein ACK mit der PaketID zurückliefert wird der entsprechende Eintrag aus der Liste gelöscht.
Nebenbei läuft in einem separaten Thread ein Timer der in einem bestimmten Intervall die Zeiten in der Liste kontrolliert, ist ein Paket überfällig wird es mit einer neuen ID versendet und der alte Eintrag gelöscht/überschrieben...
Soweit meine ersten spontanen Überlegungen, hängt na klar davon ab, was und wie Du sendest
 

agentone

Bekanntes Mitglied
Schade, obwohl TCP das Problem lösen würde.
Ich kenne allerdings auch keine andere Lösung für dieses Problem. Allerdings ist deine Formel nicht ganz richtig: Altezeit+Wartezeit < Aktuelle Zeit. 'Wartezeit' soll wohl eher Timeout heißen?
Aber wie sollte man sonst feststellen können, ob das Paket angekommen ist, wenn nicht über das Bestätigen der anderen Seite (Server)? Das ist im echten Leben auch nicht anders!
 

Lord_Aratorn

Aktives Mitglied
Der Client soll dafür selbst verantwortlich sein, dass er ein responcePacket erhällt. Es kann natürlich sein, dass dieses responcePacket verschwindet. Dann sollte der Client, da er ja die Zeit weiß, wann er das letzte Packet gesendet hat, dieses Packet erneut aufsetzen. Es soll vermieden werden, dass der Server irgendeine Art von Acknowledge sendet (ich weiß, dass es üblicher Weise so ist ;) ). Warum? Nun die Kommunikation der Teilnehmer ist verschlüsselt. Falls ein Responce erfolgt, kann ein Attentäter aus dem Inhalt der Responce lesen, ob das Packet verschwunden ist oder ob der Schlüssel nicht angenommen wurde. Mit einem solchen Angriff kann RSA ziemlich schnell geknackt werden. Dies gilt es zu verhindern.
 

Foermchen82

Top Contributor
Den Timestamp kannst du nicht zur Identifikation nutzen, da ggf. auch ein Paket 2 vor einem Paket 1 beim Client ankommen kann. Das ist halt die Natur von UDP. Hier hilft nur eine eigene ID.
Ich würde auch nicht den Server entscheiden lassen ob und wann er etwas sendet oder neu sendet. Der Client muss festellen, dass er einen GAP hat und dann aktiv beim Server nachfragen, dass er alles ab ID X neu braucht.
 

Michael...

Top Contributor
Also er sendet ein Paket und wartet auf irgendeine Antwort des Servers und solange er keine Antwort bekommt sendet er nichts weiteres?

Dann kannst Du einfach nach dem Senden einen Timer o.ä. starten. Kommt eine Antwort vom Server wird der Timer abgebrochen und das nächste Paket gesendet, der Timer neu gestarten ...
Läuft der Timer bis zum Ende durch wird das Paket nochmals gesendet und...
 

Lord_Aratorn

Aktives Mitglied
ja, so habe ich mir das auch gedacht. Nur gibt es da ein problem. Da das receive ist blockieren. Wenn also auf ein Packet gewartet wird (was es ja wird) arbeitet der Client solange nicht weiter, bis die blockade gelößt wird. Also kann auch erst dann ein neues Packet geschickt werden. Eine Alternative ist es ein nicht blockierendes erhalten zu nutzen, doch das würde die Performance stark beeinträchtigen.
 

Lord_Aratorn

Aktives Mitglied
Ja schon klar, so ist es auch realisiert. Der Server ließt die Pakete vom Stream und schreibt diese in eine LinkedBlockingQueue. Die Hauptverarbeitung dieser Pakete findet in einer weiteren Klasse statt, die die Pakete aus der Queue nimmt und entsprechend bearbeitet und ggf ein Packet sendet (d.h. ein Packet in eine Queue des Clients schreibt).
 

Michael...

Top Contributor
Meinte nur: Wie Du mit den Paketen weiter verfährst ist ja unabhängig von der Kommunikation zwischen Client und Server.
Das Lesen (im Client) vom InputStream, darf das Senden (im Client) nicht blockieren --> es muss jeweils in einem voneinander unabhängigen Thread passieren.
 

Lord_Aratorn

Aktives Mitglied
ja, ich verstehe ja deine Ausführungen. Wenn ich es so betrachte, entspricht die Architektur nicht dem was du beschreibst.
Es existieren zwar pro System jeweils ein client- und ein server-thread, doch agiert die Logik stehts in Abhängigkeit von erhaltenen Paketen. Diese werden wie gesagt von einer blockingQueue des server-threads über ein blockierendes take() abgefragt. Und hier liegt der Knackpunkt. Wenn keine blockierende Methode genutzt würde, könnte unabhängig voneinander gesendet und empfangen werden. Jedoch würde der Logikthread wegen der im run() enthaltenen while-schleife ziemlich viel Performance fressen. Dies gilt es zu vermeiden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
B Webview für Anwendung Netzwerkprogrammierung 7
M Sicheres Login-System für App implementieren Netzwerkprogrammierung 6
J Netty umsetzung für ein Protokoll Netzwerkprogrammierung 1
J ERM für kleine Verwaltungsdatenbank Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
F Einfaches Gateway für Log-Files Netzwerkprogrammierung 1
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T FTP Wie Notwendigkeit für "rekey" klientenseitig detektieren? Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
M Erreichbar für alle zu sein Netzwerkprogrammierung 9
M Server nur für eine Aufgabe Netzwerkprogrammierung 2
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
T uberspace.de als (v)root-Ersatz für kleinere Java-Anwendungen? Netzwerkprogrammierung 12
L Proxy für Dateidownload? Netzwerkprogrammierung 3
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Leitstelle für Funkspiel Netzwerkprogrammierung 8
F Java-Beispielcode für Zeroconf (ähnlich Apple Bonjour) Netzwerkprogrammierung 7
I HTTP S - Zertifikate+Cockies für Form-basierten Login Netzwerkprogrammierung 2
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N RMI Einstellungen für "übers Internet" Netzwerkprogrammierung 8
F SSL-Zertifikate für viele Nutzer? Netzwerkprogrammierung 8
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
S wie stell man die classpath für JARs? Netzwerkprogrammierung 3
M Bestimmte Klassen für Netzwerkchecks gesucht Netzwerkprogrammierung 11
M ClassLoader für Axis2 setzen Netzwerkprogrammierung 15
M Welches Speicherformat für News-Database?? Netzwerkprogrammierung 2
Shoox VPN-Verbindung für Datenbankzugriff Netzwerkprogrammierung 2
P Proxy für Anwendung setzten Netzwerkprogrammierung 3
T Bezeichner "end of line" für die Funktion readline Netzwerkprogrammierung 5
A DataGramsocket Übertragungsproblem im Internet (IPs für Voip) Netzwerkprogrammierung 5
E Userliste für Chat Applet Netzwerkprogrammierung 4
S HTTP Kleines Programm für den Routerneustart Netzwerkprogrammierung 3
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
F Netzwerkprogrammierung für Anfänger Netzwerkprogrammierung 2
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
B Variablen ausrichten für Übertragung Netzwerkprogrammierung 2
D FTP Pfadangabe für ftp-upload funktioniert nicht Netzwerkprogrammierung 5
K Getrennte Rechner für RMI-Server/RMI-Registry, bzw. Alternativen? Netzwerkprogrammierung 5
dayaftereh HTTPCleint und HTMLparser für hTTpBot Netzwerkprogrammierung 2
E Socket Client-Applikation mit GUI für Internet IO-Platine Netzwerkprogrammierung 2
0din Grundlage für Bluetooth Netzwerkprogrammierung 5
N "Jungfernflug" der Socketprogrammierung für ein Mühlespiel Netzwerkprogrammierung 8
F Empfehlung für embedded Webserver Netzwerkprogrammierung 10
W Bibliothek für Certificate Management Protocol (CMP) Netzwerkprogrammierung 3
O Client/Server für Ticker Netzwerkprogrammierung 2
J Stubs für SOAP-Webservice generieren. Ich bekomme es einfach nicht hin... Netzwerkprogrammierung 3
dayaftereh Bester Stream für ein Spiel? Netzwerkprogrammierung 15
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
G FileDialog für FTP Client Netzwerkprogrammierung 2
P Welches Protokoll für RMI verwenden? Netzwerkprogrammierung 10
H RCON Tool für Gameserver Netzwerkprogrammierung 11
A Wichtig für einen Chat? Netzwerkprogrammierung 4
D Was für Verbindungen mit Socket möglich? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
W Was für ein Stream soll ich verwenden? Netzwerkprogrammierung 8
A Rezept für Webservices Netzwerkprogrammierung 5
I unc pfad für die klasse file? Netzwerkprogrammierung 4
P eine BufferedReader für alles ankommende Netzwerkprogrammierung 2
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
T Welches Netzwerk ist am bestern für. Netzwerkprogrammierung 2
G server für mein spiel. Netzwerkprogrammierung 5
M Log In Programm für Seiten Netzwerkprogrammierung 2
G Netzwerkprogrammierung für spiele Netzwerkprogrammierung 2
A IRC-Server für das lokale Netzwerk? Netzwerkprogrammierung 12
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
S Server für Internetspiel Netzwerkprogrammierung 2
G Objecte für Kommunikation nutzen Netzwerkprogrammierung 2
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
S Voreinstellungen für JavaMail Netzwerkprogrammierung 2
S Idee für Projekt auf Agentenbasis Netzwerkprogrammierung 8
S Suche API für einfachen HTTP-Zugriff. Netzwerkprogrammierung 17
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
M RMI - Ein Objekt für Alle? Netzwerkprogrammierung 5
Z Protokoll für Schiffeversenken Netzwerkprogrammierung 5
T Kann man jeden Port für Programm verwenden? Netzwerkprogrammierung 2
R proxy für java anwendung angeben [resolved] Netzwerkprogrammierung 15
B Wie Router einstellen für CLient-Server-Programm? Netzwerkprogrammierung 4
R PPTP Protokoll für JAVA Netzwerkprogrammierung 3
Icewind Klasse für DNS Anfragen Netzwerkprogrammierung 14
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
M Socket Verbindungen für einen Chat Netzwerkprogrammierung 10
M Ausgangsport für FTp-Connection festlegen??? Netzwerkprogrammierung 3
D beste Methode für Datenübertragung ? Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben