Socket Datei nur stückweise über Socket verschicken

DougUndPizza

Mitglied
Hallo,

ich möchte die Möglichkeit anbieten einen InputStream zu einer über Netzwerk verfügbaren Datei zu öffnen.

Der FileInputStream wird auf Serverseite ausgelesen und in den OutputStream eines Sockets geschrieben, der zum Client führt. Der Client hat dann quasi im InputStream des Sockets auf seiner Seite eine Kopie des Inhaltes des ursprünlichen FileInputStreams.
Hier ein Ausschnitt der Methode auf Serverseite:

Java:
InputStream sourceFileIn = new FileInputStream(fullPath);
/* client ist ein Socket */
OutputStream clientOut = client.getOutputStream();
int bytesReadCount = 0;
while (true)
{
	bytesReadCount = sourceFileIn.read(copyBuffer);
	if (-1 == bytesReadCount)
	{
		break;
	}
	clientOut.write(copyBuffer, 0, bytesReadCount);
}

Das funktioniert auch so. Allerdings gefällt mir daran nicht, dass direkt immer die komplette Datei in den Strom geschrieben wird. Ich vermute, die TCP Pakete kommen dann beim Client an und werden solange irgendwo gepuffert, bis der Strom ausgelesen wird.

Auch wenn der Client nur den Anfang der Datei bräuchte, würde trotzdem Alles übertragen.

Ich möchte nun folgendes erreichen: Es soll immer nur soviel rübergeschickt werden, wie tatsächlich gebraucht wird.
Also in etwa: "Client ruft read auf -> Server ruft read beim FileStream auf und schreibt das in den Socket Stream.
Oder, dass immer eine bestimmte Anzahl Bytes geschickt werden, bis die auf der Gegenseite ausgelesen sind, und erst dann wird neu aus der Datei gelesen und in den Socket Stream geschrieben.


Meine Frage ist nun: Gibt es eine Möglichkeit das ohne zusätzliches Protokoll zu erreichen? - Vielleicht kann man FileInputStream und SocketOutputStream irgendwie koppeln.
 
Zuletzt bearbeitet:

irgendjemand

Top Contributor
tja ... das wirst du selbst implementieren müssen ...

der client müsste eigentlich nur dem server die info schicken wie viele bytes er haben will ... und der server liest dann so viele bytes ein und schreibt diese auf den socket ... alternativ natürlich auch in nem loop ...

while(true) -> EVIL !
lieber durch ein flag oder eine andere expression ersetzen
 
S

Spacerat

Gast
Wenn das nicht schon per BS so geht, würde ich sagen, du benötigst 'ne Pipe. Diese koppelt einen Input über einen Puffer mit einem Output. In den Input können nun solange Daten fliessen, bis der Puffer voll ist, der Input (Thread1) wird dann blockiert. Aus dem Output können natürlich auch nur so lange Daten gelesen werden, bis der Puffer leer ist, der Output (Thread2) blockiert sonst ebenfalls. Daraus folgt, dass für so eine Konstellation zwei Threads erforderlich sind. Glücklicherweise gibt es für Streams in Java bereits diverse Klassen dafür - PipedInputStream und PipedOutputStream. Das Ganze geht im übrigen auch ohne dass irgendjemand, irgendwo, irgendwelche Daten insbesondere Anzahl der erwarteten Bytes benötigt.
 
Zuletzt bearbeitet von einem Moderator:

DougUndPizza

Mitglied
Wenn das nicht schon per BS so geht...


Oder, dass immer eine bestimmte Anzahl Bytes geschickt werden, bis die auf der Gegenseite ausgelesen sind, und erst dann wird neu aus der Datei gelesen und in den Socket Stream geschrieben.

Also ich hab die obige Version mal mit Konsolenausgaben der Anzahl der in den SocketStream geschriebenen Bytes auf Serverseite laufen lassen und es scheint so, als ob diese Version bereits genau das macht, was ich erreichen wollte.

Java:
System.out.println("Server before writing");
clientOut.write(copyBuffer, 0, bytesReadCount);
System.out.println("server written bytes: "+bytesReadCount);

clientOut.write() wird 3 bis vier mal ausgeführt und blockiert dann. Sie blockiert solange, bis der Client auf der Gegenseite des Sockets eine bestimmte Menge bytes ausgelesen hat.

Leider kann ich hier Client und Server beide nur auf localhost laufen lassen und kann daher nicht ausprobieren oder mit Wireshark mitschneiden, wie es sich über Netzwerk verhält.

Ich vermute, dass der Client die Fenstergröße in den TCP Antwortpaketen auf 0 setzt, sodass der Server keine neuen Pakete mehr schickt. Wenn der Client dann aus dem Stream liest, wird die Fenstergröße wieder erhöht und der Server sendet neue Daten.
Möglicherweise ist dieses Verhalten auch generell bei Sockets (nicht nur Java) so definiert.
Das BS bestimmt quasi, wieviel Bytes gepuffert werden, bevor das Fenster auf 0 gesetzt wird.
Bei WinXP und Ubuntu sind die Werte unterschiedlich, aber jeweils immer reproduzierbar.

Stimmt meine Vermutung?
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Tja... Die Vermutung, dass es bereits per BS so implementiert ist, liegt ja nahe und faktisch passt es auch. Was passiert denn, wenn kein Client connected um sich die Daten zu holen? Gibt's dann ein SocketTimeOut? Die Werte von denen du sprichst, sind die jeweiligen Puffergrössen der Pipe und können durchaus unterschiedlich sein, die Fenster, jeweils die verbleibenden Bytes beim Schreiben bzw. die im Puffer vorhandenen Bytes zum Lesen.
Wenn du keinen 2. Rechner zur Verfügung hast, kannst es ja mal mit virtuellen Netzwerken (VirtualHostAdapter oder VirtualMaschine) ausprobieren.
[EDIT]Ach ja... nicht der Client bestimmt die Grössen des Servers sondern der Server weiss selbst, wann der Sendepuffer voll ist. Andersrum: Der Client kennt die Daten seines Empfangspuffers auch selber.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

irgendjemand

Top Contributor
hmm ... es wäre einfacher dem server nicht nur mitzuteilen welches file man will sondern auch wie viel davon ... wäre auf jeden fall unkomplizierter als sich auch irgendwelche OS sachen verlässt *BS ... da fehlt das E ...*
 

jule37

Aktives Mitglied
wenn ich es richtig verstehe verwendest du tcp - in dem fall brauchst du dir um fenster und puffergrößen keine gedanken machen, weil das protokoll garantiert, dass alles ankommt. wenn irgendwelche puffer voll sind wird automatisch nochmal gesendet.

was dein problem mit teilweise übertragen der datei angeht: du musst ja nicht sofort die ganze datei versenden. schau dir das javadoc von input stream genau an. du kannst im stream herumspringen und auch bestimmte mengen an bytes auslesen und über dein socket rausschicken. allerdings musst du dann aufpassen, dass du es auf empfängerseite wieder richtig zusammensetzt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
J Datei Download vom Server Netzwerkprogrammierung 8
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
Aruetiise Socket Datei Endung Netzwerkprogrammierung 6
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
K HTTP Formulare füllen und Datei downloaden Netzwerkprogrammierung 23
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
A Datei erzeugen und auf der Weboberfläche downloaden (Tomcat) Netzwerkprogrammierung 4
Sogomn HTTP Datei herunterladen Netzwerkprogrammierung 13
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
F FTP Einzelne Datei von FTP-Server überprüfen Netzwerkprogrammierung 0
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
S Datei(XML) per RMI an Server schicken Netzwerkprogrammierung 0
V Datei Download Fenster Netzwerkprogrammierung 9
S Datei schreiben über Applet Netzwerkprogrammierung 8
C Socket Datei Übertragung Netzwerkprogrammierung 5
D Datei hochladen zu PHP Server Netzwerkprogrammierung 8
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
H Datei in DropBox schreiben Netzwerkprogrammierung 23
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
V Datei auf Server Schreiben Netzwerkprogrammierung 18
N Einen Server als ausführbare Datei exportieren Netzwerkprogrammierung 15
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
C Datei auf server speichern Netzwerkprogrammierung 16
P FTP Nochmal wachsende Datei per FTP lesen Netzwerkprogrammierung 9
W Datei automatisiert kopieren! Netzwerkprogrammierung 5
P Wachsende Datei per FTP lesen Netzwerkprogrammierung 2
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
G Txt datei von Website downloaden Netzwerkprogrammierung 8
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
S ActiveMQ, JMS und Datei übertragen Netzwerkprogrammierung 25
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
U Web Datei downloaden und bei Änderungen wieder zurückspielen Netzwerkprogrammierung 5
M Class-Datei aus Eclipse mit Xampp Netzwerkprogrammierung 4
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
B Zugriff auf eine Text- und XML-Datei Netzwerkprogrammierung 4
Dit_ FTP, Datei Hochladen Netzwerkprogrammierung 4
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
J Datei übertragen ja String + datei übertragen nein Netzwerkprogrammierung 5
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
N Socket TCP Datei Transfer Netzwerkprogrammierung 2
L Java über php datei lesen? Netzwerkprogrammierung 18
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
weeego Ping über CMD, Umweg über Batch Datei sparen. Netzwerkprogrammierung 17
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
S StringArray in .txt Datei --> langsam wegen Client/Server!? Netzwerkprogrammierung 16
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
U Datei via UDP Netzwerkprogrammierung 8
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
S Error 404 obwohl die Datei existiert Netzwerkprogrammierung 9
T Datei Herunterladen und ausführen Netzwerkprogrammierung 5
S Mittels Java XML abfragen und nicht die Ausgabe-HTML-Datei Netzwerkprogrammierung 5
C PCAP Datei auslesen Netzwerkprogrammierung 8
F Applet Datei Zugriff Netzwerkprogrammierung 13
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
M [Commons NET] Prüfen, ob auf FTP Datei vorhanden ist Netzwerkprogrammierung 2
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
C Dateiübertragung - Datei immer ein 4096faches von n Netzwerkprogrammierung 2
E Applet zum Datei-Upload Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
J Gibts die Datei? Netzwerkprogrammierung 3
K Datei-Upload per FTP Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
S über rmi datei übertragen? Netzwerkprogrammierung 2
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
G.I.Joe Datei per POST übertragen Netzwerkprogrammierung 2
B Umfangreiche Batch Datei (Rmiregistry prüfung + Prog. start) Netzwerkprogrammierung 4
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
F Datei senden und empfangen Netzwerkprogrammierung 4
B Via Java Datei zu PHP-Script auf Apache hochladen Netzwerkprogrammierung 4
B knacken bei download von mp3 datei Netzwerkprogrammierung 2
T Datei senden Netzwerkprogrammierung 3
M Datei auf Remoteserver kopieren Netzwerkprogrammierung 8
B Datei speichern unter Netzwerkprogrammierung 10
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8
T Musik-Stream: Server sendet die Datei zu schnell ? Netzwerkprogrammierung 3
T Mit FTP verbinden, einen Ordner erstellen und Datei löschen Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben