Socket kein Input

mastercoll5

Aktives Mitglied
Hallo!

Ich habe einen Server, der eine (oder mehrere) Dateien zu einem Client senden soll, erstellt.
Dazu habe ich einen Thread mit einen Scanner, der den Input darstellt. Dieser dient zunächst dazu ein eingehendes "exit" von Client aufzunehmen, um zu wissen, ob der Client geschlossen wurde. Das funktioniert erstmal recht gut.

Jedoch habe ich herausgefunden, dass ein Fehler eintritt, wenn der Client während des Sendens einer Datei geschlossen wird. Das "exit" wird einfach nicht vom Scanner aufgenommen,

Hat jemand eine Idee wie man dieses Problem lösen könnte?
 

Major_Sauce

Bekanntes Mitglied
Vielleich weil der Stream schon von der Datei voll ausgelastet ist ?
Bis die Datei fertig "runtergeladen" ist, wird wohl nichts anderes gesendet.
Ich weiß nicht ob das der Grund ist, wäre nur so mein erster Einfall....

mfg Major
 

Tobse

Top Contributor
Also wenn das "exit" ohne Sendevorgang beim Server ankommt kannst du folgende Ursache ausschließen: Stream nicht geflushed/geclosed.

Kommt denn das "exit" nach dem Sendevorgang dann an?

An sonsten könnte es noch sein, dass du beim Server irgendwo ausversehen den Input-Stream vom Client zu machst.
 

mastercoll5

Aktives Mitglied
Erstmal Danke für die Antworten,

Zu Tobse: Nein, das exit kommt leider nicht später an. Wenn aber der Client nach den Sendevorgang geschlossen wird, wird das "exit" wieder richtig übertragen, dh. der InputStream vom Server wird nicht geschlossen. Das würde dann die 1. Antwort Major_Sauce bestätigen.

Zu InfectedBytes: Entweder ich habe dich nicht ganz verstanden, oder die Situation ist nicht ganz klar bei dir angekommen. Der Server sendet eine Datei (byte-Array) zum Client. Wenn der Client beendet wird, wird ein "exit" an den Server geschickt um zu wissen wann ein Client vom Server getrennt wird. Jedoch kommt dieses Exit nicht beim Server an, wenn es während der Übertragung der Datei vom Server an den Client gesendet wird.

Hätte jemand noch eine andere Idee, wie man dieses "exit" ersetzten könnte? Ich denke da an so was wie s.isConnected(). Jedoch finde ich die Abfrage in einer Schleife nicht sehr elegant.

mistercoll
 

InfectedBytes

Top Contributor
Ich habe dein Problem schon verstanden, aber da du uns keinen Code gezeigt hast, müssen wir halt ein wenig dein eigentliches Problem erraten.

Vielleicht mal etwas zu TCP:
TCP arbeitet verbindungsorientiert und ist Reihenfolge erhaltend.
D.h. wenn du zwei Pakete (A und B) nacheinander abschickst, kann Paket B erst von deinem Programm genutzt werden, wenn A angekommen ist. Wenn nun A sehr groß ist, kann es halt sehr lange dauern bis man B erhält.

Daher zerteilt man große Dateien oft in kleinere Blöcke, wodurch man ggf. andere Paket zwischen schieben kann:
Angenommen wir Teilen A in vier kleinere Pakete auf und senden B zwischendrin:
A1 A2 B A3 A4
Dadurch kann nun B empfangen werden, obwohl A noch nicht ganz angekommen ist.

Ich bin davon ausgegangen, dass du diesen Ansatz verwendest, jedoch bei der Paketzuordnung einen Fehler hast, wodurch der Empfänger dein "exit" als Teil eines großen Pakets betrachtet.
 

mastercoll5

Aktives Mitglied
Ich habe den Rat von Infectedbytes befolgt und nicht die Datei in einmal, sondern in mehrere Teile geteilt (1 Kb Größe). Das ist mir jetzt auch sinnig, da der exit Befehl erst nach der kompletten übertragen der Datei gesendet werden kann. Zu dieser Zeit ist der Client aber schon geschlossen .
 

Ähnliche Java Themen


Oben