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:
Beim Empfänger sieht es so aus:
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.
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.