PDF und integer senden

Status
Nicht offen für weitere Antworten.

DEG1935

Mitglied
Hallo Zusammen,

ich würde gerne von einem Client eine Datei (z.B. PDF) an einen Server senden. Soweit so gut. Dazu möchte ich der Datei aber noch eine ID (integer) mitgeben.

Ich dachte mir, dass ich Datei und ID einfach über DataOutputStream versende. Leider klappt das bisher nur bei kleineren Textdateien, Binärdateien sind nicht möglich.

Ich gehe wie folgt vor: Datei in einen FileInputStream stecken und mittels read(byte []) in ein byte[] kopieren. Dann sende ich über DataOutputStream zuerst die ID writeInt(int) und danach sende ich das byte[]. Zum Testen erstelle ich aus dem byte[] mittels BufferedOutputStream.write eine Kopie der Datei.

Ergebnis: Senden klappt prima, Datei kommt an. Ist leider nur nicht zu gebrauchen. Die Kopie der Datei, die nicht versendet wurde ist ok. Bei Textdateien ist auch die versendete Datei ok.

Hier der Code des Senders:
Code:
Socket sock = new Socket(args[0], 1055);
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();

sock.setSoTimeout(30000);

int telNr=2;
int laenge=-1;

File f = new File("C:\\temp\\A\\vm.pdf");
File tempF = new File("C:/temp/B/temp.pdf");

laenge = (int)f.length();

FileInputStream fis = new FileInputStream(f);			
DataOutputStream dos = new DataOutputStream(out);

try {
    
    dos.writeInt(telNr);
    dos.writeInt(laenge);
    
    // Datei ins byte[]
    byte[] b = new byte[laenge];
    int tempi = fis.read(b);
    fis.close();
    
    // byte[] senden
    dos.write(b, 0, tempi);
    dos.flush();

    //Kopie erstellen:
    BufferedOutputStream fileout = new BufferedOutputStream(new FileOutputStream(tempF));
    fileout.write(b, 0, laenge);
    fileout.close();

} catch (IOException e) {
    e.printStackTrace();
}
in.close();
out.close();
sock.close();

Beim Empfänger sieht es so aus:
Code:
InputStream in = client.getInputStream();
DataInputStream dis = new DataInputStream(in);

int telNr = dis.readInt();
int laenge = dis.readInt();

byte[] b = new byte[laenge];
int tempi = dis.read(b, 0, laenge);

System.out.println("gelesene Bytes=" + tempi);

File f = new File("C:\\temp\\B\\heute.pdf");
FileOutputStream fileout = new FileOutputStream(f);
fileout.write(b, 0, laenge);

client.close();
fileout.close();

Ach ja, was mich auch verwirrt ist der println() des Empfängers, der mir die gesendeten bytes zeigen soll, nur 64KB zurückgibt, obwohl es laut Feld Länge über 100KB sein müssten. Wo liegt mein Denkfehler? Oder würdet ihr diese Ausgabe überhaupt so lösen? Trete gerade ein wenig auf der Stelle.
 
T

tuxedo

Gast
Ein einfaches read() liest macht das übergebene byte[] nicht immer komplett mit Daten voll. Es wird hier nur so viel gelesen wie gerade gelesen werden kann (kann also sein dass ein Rest noch "unterwegs" ist oder irgendwo in einem Puffer feststeckt). Du kannst hier aber readFully() des DataInputStreams verwenden. Dann wird exakt so viel gelesen wie das byte[] groß ist (sofern so viele Daten auch wirklich zum lesen aus dem Stream kommen.

Weitere Infos findest du in der Java-Doc zu den jeweiligen Methoden.

- Alex
 

DEG1935

Mitglied
Super, das mit dem readFully hat es gebracht! Hatte ja auch gedacht, dass da irgendwo etwas hängengeblieben ist, aber genau das sollte am Client durch das flush() verhindert werden. readFully :oops: ich sollte aufmerksamer Doku lesen.

Vielen Dank für den Hinweis!
 
T

tuxedo

Gast
Naja, readFully() ist auch nichgt das gelbe vom Ei. Schlißelich wird da ja ne ganze Zeit blockiert bis alles da ist. Manchmal ist es sinnvoller in einer while-Schleife immer und immer wieder read() aufzurufen und sich so alles "zusammen zu lesen" bis man "laenge" erreicht hat.

Das macht vor allem dann Sinn, wenn man Speicher sparen will und die Datei nicht in ein einzelnes byte[] passt. Stell dir vor du müsstest eine Datei mit 150 MB transferieren. Würdest du dann ein byte[] mit 150MB größe anlegen? Sicher nicht. Deine JVM bedankt sich erst mal mit einer OutOfMemoryException oder so.

Also lieber eine sinnvolle Puffergröße für das Array wählen und in einer Schleifen Stück für Stück alles lesen und entsprechend weiterreichen (z.B. an einen Outputstream der die Datei gleich speichert.)..

- Alex
 

DEG1935

Mitglied
Guter Einwand, habe dies gestern Abend berücksichtigt und den Empfänger ein wenig umgestellt:

Code:
int Id = dis.readInt();
int laenge = dis.readInt();
byte[] b = new byte[1024];
File f = new File("C:/temp/B/heute.pdf");
BufferedOutputStream fileout = new BufferedOutputStream(new FileOutputStream(f));
int len;
while((len=dis.read(b))!=-1){
    fileout.write(b, 0, len);
}
fileout.close();

Wobei die vorherige Methode, also das readFully sehr wahrscheinlich gereicht hätte, da eigentlich nie Dateien > 10MB gesendet werden. Aber wer weiß schon was in Zukunft ist, besser gleich vernünftig. :wink:
 
T

tuxedo

Gast
Jupp, so sieht's besser aus. Nur die "Id" könntest du noch am Anfang klein schreiben (Java-Code-Convention: Variablennamen fangen klein an).

- Alex
 

DEG1935

Mitglied
Ja ne is klar! Das war auch nur das Beispiel zum Post. Werde auch dort demnächst mehr auf die Details achten. :wink:

Nochmals vielen Dank für deine Hilfe, funktioniert nun super! :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
E Socket Befehl senden und antowrt bekommen ! Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
L Socket Nachrichten senden Netzwerkprogrammierung 3
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
B Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen Netzwerkprogrammierung 1
M Socket Bilder senden Netzwerkprogrammierung 1
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
W Socket Byte Array senden Netzwerkprogrammierung 2
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
X UDP - Zu großes Paket senden Netzwerkprogrammierung 1
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
I Kleine Dateien senden Netzwerkprogrammierung 3
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
S Server-Client: Image senden Netzwerkprogrammierung 2
B Socket BufferedImage senden "ohne speichern" Netzwerkprogrammierung 7
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
K Socket Senden und abspeichern Netzwerkprogrammierung 34
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Empfangen klappt Senden nicht - Connection timed out Netzwerkprogrammierung 12
D Strings per Schleife zum Client senden Netzwerkprogrammierung 4
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Verschiedene Datentypen senden Netzwerkprogrammierung 4
M Befehle an externes Java-Programm senden Netzwerkprogrammierung 8
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
Weltall 7 HTTP Dateien an PHP-Skript senden Netzwerkprogrammierung 11
T Outputstream Byte-Array senden Netzwerkprogrammierung 2
N Senden eines Arrays Netzwerkprogrammierung 6
F Char über Netzwerk senden Netzwerkprogrammierung 6
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
J Befehle an Server senden Netzwerkprogrammierung 5
L Zeitspanne für erneutes senden Netzwerkprogrammierung 16
Kr0e Ggf. Performanceproblem durch Senden von vielen kleinen Buffern Netzwerkprogrammierung 17
S Socket OutputStreams senden zu oft Netzwerkprogrammierung 6
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
KeNnY_tHe_OwNeR Empfangen geht, Senden nicht ?! Netzwerkprogrammierung 18
B Befehle an Gameserver senden bzw. empfangen Netzwerkprogrammierung 2
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
T HttpClient - Senden via Post Netzwerkprogrammierung 12
Q Datein von Windows nach Mac senden Netzwerkprogrammierung 4
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
M Dateien über TCP/IP senden Netzwerkprogrammierung 18
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
G Information an Server senden? Netzwerkprogrammierung 4
M BufferedImage an PHP-Script senden Netzwerkprogrammierung 4
J Problem beim Senden von File Netzwerkprogrammierung 4
S String[] über Socket senden Netzwerkprogrammierung 3
G unbekannte Zeichen beim senden und lesen Netzwerkprogrammierung 2
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
T Image aus Applet an PHP Seite senden? Netzwerkprogrammierung 3
D BufferedImage über das Netzwerk senden Netzwerkprogrammierung 2
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
R Bytes als Rohdaten über Socket senden Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
W Hexadezimal über RS232 senden Netzwerkprogrammierung 9
L webformular automatisch erstellen, senden und auswerten . Netzwerkprogrammierung 2
G Anfrage an Suchmaschine senden Netzwerkprogrammierung 11
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
M datagramSocket senden u. empangen? Netzwerkprogrammierung 2
V Java /Matrizen senden über TCP/IP / double Netzwerkprogrammierung 2
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
M HTTP Requests verarbeiten und Response senden mit Java Netzwerkprogrammierung 14
G Problem bei Objekt senden von server zu client Netzwerkprogrammierung 6
K RMI und kontinuirliches senden von Datenpacketen Netzwerkprogrammierung 2
N Messwerte über TCP senden Netzwerkprogrammierung 3
F Datei senden und empfangen Netzwerkprogrammierung 4
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
N Hexcode an ein Programm senden. Netzwerkprogrammierung 4
I Dateien schnell/synchron senden Netzwerkprogrammierung 2
T Datei senden Netzwerkprogrammierung 3
B Variablen an Server senden Netzwerkprogrammierung 14
R Problem beim Senden von Emails (Javamail) Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5
J JavaMail Exception bei senden an anderen Server. Netzwerkprogrammierung 8
TRunKX Hilfe beim senden und empfangen Netzwerkprogrammierung 2
A Webserver - Bild senden Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben