Einfacher Filedownload mit Sockets geht nicht für pdffiles

Status
Nicht offen für weitere Antworten.

coolex

Mitglied
Hallo!

Ich möchte einen Fileserver programmieren.
Es handelt sich dabei um eine Socket Lösung und die Dateien sollen dann über Streams runtergeladen werden.
Auf Anfrage des Clients liest der Server die Dateien zeilenweise ein und verschickt sie dann gleich wieder an den Client.
Auf der Clientseite "sammle" ich die ankommenden Zeilen wieder ein und bastle mit denen dann eine Datei zusammen.
Leider funktioniert diese Methode nicht für z.B. Pdf dateien. Die Pdf datei wird zwar erstellt (mit falscher Dateigröße), aber ich kannn sie nicht öffnen. :-(
Für Textdateien geht das wunderbar.

Welche Streams sollte man dafür grundsätzlich nutzen?

Ich hoffe, ihr könnt mir helfen.

Danke.
Alex
 

kleiner_held

Top Contributor
Du liest die PDF Datei zeilenweise ein?
Klingt fuer mich so, also wuerdest du deine Binaerdaten in Strings konvertieren.

Dein Sender sollte ungefaehr so arbeiten:
Die Daten aus einem FileInputStream unter Mithilfe eines byte[] Arrays gleich in den Socket-OutputStream kopieren.
Beim Empfaenger dann genau umgedreht:
Vom Socket-InputStream in den FileOutputStream kopieren.
 

coolex

Mitglied
Danke für die schnelle Antwort.

Ich nun auf der Serverseite es geschafft, dass er nun mit den "normalen" Sttreams arbeitet. Er schreibt also zunächst die Datei in ein bytearray (byte[]) und verschickt diesen sofort in den outputstream des sockets.

Allerdings kämpfe ich schon die ganze Zeit auf der Clientseite und komme nicht weiter, wie ich nun die ankommenden Daten in eine Datei schreiben soll. Ich habe mir auch überlegt den BufferedInputStream zur Hilfe zu nehmen, was bei mir auch nicht funktioniert hat.
Eines meiner größten Probleme ist die Größe des byte arrays. Ich habe es bisher nicht geschafft, dass die Größe während der Laufzeit, je nach dem wie größ die Datei werden soll, festgelegt wird.

Ich habe da Dinge stehen, wie z.B.
Code:
inStream = socket.getInputStream();
fileArray = new byte[1000000]; // hier weiß ich nicht, wie ich es dynamischer machen soll
inStream.read(fileArray);
fileOutStream.write(fileArray);
fileOutStream.flush();

Ich bin langsam am verzweifeln. Ich hoffe, ihr könnt mir weiterhelfen.
Danke.

Alex
 

HoaX

Top Contributor
braucht du nicht, du kannst so oft kleine blöcke an daten lesen/schreiben bis das ende erreicht ist.
 

coolex

Mitglied
Meinst du, dass ich keinen BufferedInputStream brauche?
Kannst du eventuell ein Beispiel angeben, was du meinst?

danke
 

HoaX

Top Contributor
du baust die eine schleife die solange läuft bis nichtsmehr im inputstream is. in der schleife liest du den stream häppchenweise ein und schreibst ihn ebenso in die datei.
 

coolex

Mitglied
Also sowas wie das vielleicht:

Code:
inStream = socket.getInputStream();

byte b;
while((b = (byte)inStream.read()) >= 0 && (b = (byte)inStream.read()) <= 256){
    fileOutStream.write(b);
}

fileOutStream.flush();

Oder fehlt noch was?
 

kleiner_held

Top Contributor
Normalerweise macht man es so:

Code:
private void copy(InputStream in, OutputStream out) throws IOException
{
	// buffer fuer die daten anlegen
	byte[] buffer = new byte[102400]; // 100 kByte
	int cnt; 
	// return von read ist die anzahl der gelesenen bytes, wenn -1 dann
	// ist der Stream zuende
	while ((cnt = in.read(buffer)) > -1) 
	{
		// alles was gelesen wurde auch wieder rausschreiben
		out.write(buffer, 0, cnt);
	}
	out.flush();
}

// server
InputStream in = new FileInputStream("C:\\in.pdf");
OutputStream out = socket.getOutputStream();
copy(in, out);
in.close();

// client
InputStream in = socket.getInputStream();
OutputStream out = new FileOutputStream("C:\\out.pdf");
copy(in, out);
out.close();
 

HoaX

Top Contributor
coolex hat gesagt.:
Also sowas wie das vielleicht:

Code:
inStream = socket.getInputStream();

byte b;
while((b = (byte)inStream.read()) >= 0 && (b = (byte)inStream.read()) <= 256){
    fileOutStream.write(b);
}

fileOutStream.flush();

Oder fehlt noch was?

so auf jedenfall nicht!

a) bytes einzeln zu lesen ist seeeeehr inperformant

b) was da gelesen wird ist ein int, kein byte, lass es einfach so

c) ein byte ist immer <=128 in java

d) du rufst 2 mal read auf, aber nur einmal write ... du speicherst nur jedes zweite zeichen
 

coolex

Mitglied
Vielen Dank!
Die Lösung von dem "kleinen Held" hat mir am besten geholfen.

Also nochmals vielen dank.
 

coolex

Mitglied
Hallo!

Mir ist aufgefallen, dass dies für pdf dateien nicht funktioniert. :-(
Woran kann es denn liegen?

Alex
 

kleiner_held

Top Contributor
Da musst du schon ein paar Details mehr geben, wenn du willst, dass dir geholfen wird.
Das byteweise Kopieren mit Hilfe von Input- / Outputstreams funktioniert für alle Dateien unabhängig vom Inhalt. Wenn bei dir etwas nicht klappt, dann nicht weil es eine PDF-Datei ist, sondern weil ein Programmierfehler vorliegt.
 

coolex

Mitglied
Nun gut.
Ich habe deine copy methode benutzt.
Das downloaden funktioniert. Die Dateigröße stimmt auch. Alles wunderbar, ABER wenn ich die PDF datei öffnen will, bekomme ich eine Fehlermeldung :-(
MP3 werden problemlos runtergeladen. Ich kann sie auch öffnen und abspielen.

alex
 

kleiner_held

Top Contributor
Aber die originale PDF Datei lässt sich problemlos öffnen?
Hast du schon mal die originale Datei und die durch dein Programm downgeloadete Datei inhaltlich (binär) miteinander verglichen?
 

coolex

Mitglied
Die originale PDF datei lässt sich problemlos öffnen.
Einen Binärvergleich habe ich nicht gemacht. Was genau meinst du damit? Wie soll das gemacht werden?
 

coolex

Mitglied
Moment, ich habe den Fehler nun selbst gefunden. Der Fehler lag darin, dass mein Programm die PDF datei noch benutzt hat und deshalb der Acrobat Reader sie nicht öffnen wollte.
Nun geht es.

Trotzdem vielen Dank für die Hilfe.

Alex
 

kleiner_held

Top Contributor
Man kann z.B.: mit Diff (der Artikel enthält auch Links zu freien Windowsimplementierungen) zwei Dateien binär vergleichen. Damit kann man rausfinden, ob sie sich überhaupt unterscheiden und falls ja, worin sie sich unterscheiden.

Edit: Ok, hat sich also erledigt. Na dann viel Erfolg noch :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
B Einfacher Server mit Jetty Netzwerkprogrammierung 3
F RMI einfacher Chat - Callbacks(?) funktionieren nicht Netzwerkprogrammierung 7
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
S Socket Einfacher filetransfer Netzwerkprogrammierung 10
B Einfacher Proxy Server Netzwerkprogrammierung 29
M Socket Probleme mit einfacher Socketverbindung Netzwerkprogrammierung 3
L einfacher server ohne threads Netzwerkprogrammierung 4
P Einfacher Server/Client Netzwerkprogrammierung 5
L Einfacher Proxy-Server Netzwerkprogrammierung 6
A einfacher Transfer mit Applets Netzwerkprogrammierung 4
T Einfacher Servlet-Server Netzwerkprogrammierung 8
S Einfacher Multiuser chat in java Netzwerkprogrammierung 18
Jannn Socket Sockets an ein anderes Gerät weiterreichen? Netzwerkprogrammierung 8
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
D Socket Verwirrung bei Sockets Netzwerkprogrammierung 1
E Mehrere Sockets Netzwerkprogrammierung 2
N Fragen zu Sockets Client Netzwerkprogrammierung 3
A Sockets Serialisierung Netzwerkprogrammierung 1
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
T Socket Bidirektionale Verbindung mit Sockets Netzwerkprogrammierung 8
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
C Socket Datagram-Sockets mit integrierter Message Queue? Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
F Technologiewahl: Swing/RMI/Sockets Netzwerkprogrammierung 13
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
M Socket Sockets Grundlage Netzwerkprogrammierung 25
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
D Socket Raw Sockets mit java.net.*? Bsp ICMP Netzwerkprogrammierung 7
H Komprimierte Sockets Netzwerkprogrammierung 4
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
L Sockets übergeben Netzwerkprogrammierung 4
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
B Socket Was muss man bei Sockets beachten? Netzwerkprogrammierung 10
N Socket Sockets und Events Netzwerkprogrammierung 11
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
D RMI oder Sockets Netzwerkprogrammierung 4
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
Q Thread und Sockets... Netzwerkprogrammierung 2
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
J Array oder Object über Sockets Netzwerkprogrammierung 8
O Sockets -- Einsieg Netzwerkprogrammierung 3
S Sockets und gzip Netzwerkprogrammierung 8
B Nachricht über Sockets kommt nicht an Netzwerkprogrammierung 8
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
S Wiedereinmal Sockets ;-) Netzwerkprogrammierung 15
J Ascii / Unicode bei Sockets? Netzwerkprogrammierung 2
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Sockets Netzwerkprogrammierung 10
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
E Sockets, readLine() Netzwerkprogrammierung 7
M Sockets und InputStream Netzwerkprogrammierung 8
G Verbindung über Sockets Netzwerkprogrammierung 2
S zip-files über sockets übertragen Netzwerkprogrammierung 11
G immer wieder gleiche Sockets Netzwerkprogrammierung 2
V Suche Alternative zu Sockets Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
B Übertragung via Sockets Netzwerkprogrammierung 12
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
T Sockets Verständnisfrage: abwechelnd lesen-schreiben Netzwerkprogrammierung 4
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
Y buch: Netwerprogrammierung und Sockets Netzwerkprogrammierung 2
B Eigenes Protokoll über Sockets verschicken Netzwerkprogrammierung 4
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
C Sockets über Internet Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
D Java Sockets Probs Netzwerkprogrammierung 4
N Verarbeitung nach Weiterleitung in Sockets Netzwerkprogrammierung 2
A Serialisierung über Sockets möglich? Netzwerkprogrammierung 3
M sockets (security) Netzwerkprogrammierung 2
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben