Socket Datei Übertragung

ceddy

Mitglied
Hallo, ich versuche über Sockets eine Datei vom Client zum Server zu übertragen:

Server:
Java:
    public void downloadFile(String path) throws IOException
    {
        
        OutputStream outputStream = this.client.getOutputStream();
        outputStream.write(DOWNLAOD_FILE);//Damit der Client weis, dass er eine Datei übertragen soll
        byte[] buffer = new byte[4069];
        for(int i=0; i<path.length(); i++)
        {
            buffer[i]=(byte)path.charAt(i);;
        }
        outputStream.write(buffer);//Pfad der Datei an client senden
        outputStream.flush();
        InputStream inputStrem =this.client.getInputStream();
        File file=new File(path);
        File outputFile = new File(file.getName());
        FileOutputStream fileOutoutStream = new FileOutputStream(outputFile);
        buffer = new byte[4096];
        int x = inputStrem.read(buffer);
        int filelength = Integer.valueOf(new String(buffer,0,x));//Länge der zu ladenen Datei erhalten
        buffer = new byte[filelength];
        inputStrem.read(buffer,0,filelength);//Daten der Datei erhelten
        
        fileOutoutStream.write(buffer,0,filelength);//Datei Schreiben
        fileOutoutStream.flush();
        fileOutoutStream.close();
     }


Client
Java:
    private void uploadFile(InputStream reader) throws IOException, InterruptedException
    {
        byte[] buffer = new byte[4069];
        int n = reader.read(buffer);
        String path = new String(buffer,0,n);//Pfad zu Datei empfangen
        File inputFile = new File(path);
        FileInputStream fileInputStream = new FileInputStream(inputFile);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        
        OutputStream outputStream = this.client.getOutputStream();
        PrintWriter writer = new PrintWriter(outputStream);
        int filength = (int)inputFile.length();//Größe der Datei auslesen
                
        writer.write(String.valueOf(filength));//Größe der Datei an Server senden
        writer.flush();
        
        byte buffer2[] = new byte[filength];
        bufferedInputStream.read(buffer2,0,filength);//Datei einlesen
        outputStream.write(buffer2);//Datei an Client senden
        outputStream.flush(); 
    }

Bei sehr kleinen Dateien klappt das alles auch sehr gut, wir die Datei jedoch etwas größer, geht die Datei irgendwie kaputt, sie hat zwar die gleiche Größe wie die Ursprungsdatei, aber ein Bild z.B ist zu 89% schwarz, eine PDF lässt sich gar nicht öffnen.

Ich hoffe jemand kann mir sagen wo das Problem liegt.
 
mal von abgesehen das es bereits ein thema gibt : http://www.java-forum.org/allgemein...an-txt-files-uebers-internet-verschicken.html ... was zur hölle machst du da ?
der größte fehler dürfte wohl der Writer in zeile 11 sein der die binär-daten völlig zerstört ...

Reader / Writer sind NUR für TEXT ... binär-daten sind grunsätzlich mit RAW-Streams zu verarbeiten ...

wenn dir diese tipps nicht helfen sag bescheid ... dann schreib ich dir *und villeicht auch dem TO des anderen threads* mal ein file-exchange programm ... langsam nervt das thema ...
 
vielleicht könntest du den code ja posten ... damit andere die wie du und der TO des gelinkten topics auch was von haben ... (und weil ich kein bock hab hier mal eben n file-exchange zu basteln)
 
Es kann gut sein, dass das alles nicht besonders gut ist, aber da es funktioniert und ich das ganze nur zum Spaße mache reicht mir das so.

Server:
Java:
    public void downloadFile(String path) throws IOException, ClassNotFoundException
    {
        
        ObjectOutputStream oos = new ObjectOutputStream(this.client.getOutputStream());
        oos.write(DOWNLAOD_FILE);//Ein int damit der Cliet weis was er machen soll
        oos.flush();
        oos.writeObject(path);
        oos.flush();
        ObjectInputStream ois = new ObjectInputStream(this.client.getInputStream());
        File file=new File(path);
        File outputFile = new File(file.getName());
        FileOutputStream fileOutoutStream = new FileOutputStream(outputFile);
        byte []buffer =(byte[])ois.readObject();
        fileOutoutStream.write(buffer,0,buffer.length);
        fileOutoutStream.flush();
        fileOutoutStream.close();
    }

Client
Java:
    private void uploadFile(ObjectInputStream ois) throws IOException, InterruptedException, ClassNotFoundException
    {
        String path = (String)ois.readObject();
        File inputFile = new File(path);
        FileInputStream fileInputStream = new FileInputStream(inputFile);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        OutputStream outputStream = this.client.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(outputStream);
        byte buffer[] = new byte[(int)inputFile.length()];
        bufferedInputStream.read(buffer,0,(int)inputFile.length());
        oos.writeObject(buffer);
        oos.flush();
    }
 
du hast einen gravierenden fehler ... und ich denke das ich diesen mit meinem lieblingsbeispiel deutlich machen kann ..

dein code liest erst das gesamte file in den speicher ... überträgt dann diesen buffer ... liest ihn am server auch erstmal wieder komplett in den ram ... und erst dann wird es raus ins file geschrieben ...

hmm ... was meinst du wohl was passiert wenn du versuchst ne datei zu übertragen die größer ist als der verfügbare RAM ? (ohne vm-option knallt es schon vorher) ... RICHTIG : du bekommst probleme weil das file nicht mehr komplett in den RAM passt ...

besser wäre hier mit nem kleinen buffer von 1MB oder so zu arbeiten und dann immer stückweise das file einlesen und zum server senden ... dieser liest dann den 1MB-buffer und schreibt ihn gleich raus ins file ...


btw : ich würde dafür auch keinen ObjectStream nutzen ... das geht alles auch mit RAW-streams ... zu mal ObjectStreams auch noch einiges an overhead erzeugen ...
 

Neue Themen


Zurück
Oben