Datei Übertragung (Socket) klappt nicht bei Auslastung des PC

++++ Update ++++

Ich habe zum testen mal diesen Ansatz hier verfolgt:
http://www.tutorials.de/java/236645-objekte-im-netzwerk-senden-empfangen.html#post1234045
Klappt wunderbar, die Dateien werden korrekt gesendet, die empfangene Datei ist genauso groß, wie die gesendete.

Wenn ich das ganze aber für meine Zwecke anpasse und in meinem Programm verwende, klappt es wieder nicht...

Java:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class Sender {
 
    public static void send(Socket socket, String filePath) {
 
        File file = new File(filePath);
        System.out.println("Fileobjekt erstellt.");
        
        try {
 
            DataOutputStream dos = new DataOutputStream(socket
                    .getOutputStream());
            System.out.println("DataOutputStream erstellt.");
 
            FileInputStream fis = new FileInputStream(file);
            System.out.println("FileInputStream erstellt.");
 
            byte[] buffer = new byte[1024];
            int i = 0;
            int fileSize = 0;
            while ((i = fis.read(buffer)) != -1) {
                dos.write(buffer, 0, i);
                fileSize += i;
            }
 
            System.out.println("Senden abgeschlossen.");
            System.out.println("Gesendete größe: " + fileSize);
            dos.flush();
            fis.close();
        } catch (FileNotFoundException e1) {
            System.out.println("Datei senden, error: " + e1.getMessage());
        } catch (UnknownHostException e1) {
            System.out.println("Datei senden, error: " + e1.getMessage());
        } catch (IOException e1) {
            System.out.println("Datei senden, error: " + e1.getMessage());
        }
    }
}

Java:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Empfaenger extends Thread {

    private Socket socket = null;
    
    private int m_size = 0;

    public Empfaenger(Socket _socket, int _size) {
        super();
        socket = _socket;
        m_size = _size;
        setPriority(Thread.MIN_PRIORITY);
    }

    public void run() {
        super.run();

        try {

            DataInputStream is = new DataInputStream(socket.getInputStream());
            System.out.println("DataInputStream erstellt");

            File tmpFile = new File("C:\\Temp\\Test.zip");
            System.out.println("Fileobjekt erstellt");

            FileOutputStream fos = new FileOutputStream(tmpFile);
            System.out.println("FileOutputStream erstellt");

            byte[] buffer = new byte[1024];
            int i = 0;
            int fileSize = 0;
            while (fileSize < m_size) {
                i = is.read(buffer);
                fos.write(buffer, 0, i);
                fileSize += i;
            }
            System.out.println("Empfangen abgeschlossen.");
            System.out.println("Empfangene größe: " + fileSize);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Datei empfangen, error: " + e.getMessage());
        }
    }
}

Sooooo langsam kommt mir der Verdacht, dass es an der Umgebung liegt, in der das Senden/Empfangen stattfindet, d.h. der restliche Programmteil...

++++ Update ++++
Lokal läuft es nun, warum? ka...naja zumindest nicht genau, vll. läuft mein rechner grad einfach nur besser, denn von der VM zu mir klappts noch immer nicht...
 
Zuletzt bearbeitet:
Code:
 byte[] buffer = new byte[1024];
            int i = 0;
            int fileSize = 0;
            while ((i = fis.read(buffer)) != -1) {
                dos.write(buffer, 0, i);
                fileSize += i;
            }
Hier läuft einiges schief, vergleiche den Teil mal mit dem entsprechenden in deinem gelinkten Beispiel.

Code:
 while (fileSize < m_size) {
                i = is.read(buffer);
                fos.write(buffer, 0, i);
                fileSize += i;
            }
Auf der Emfängerseite das selbe. i ist hier der char, der in dem aktuellen Lesevorgang gelesen wurde.
Am besten postest du auch noch deine main Methoden dazu.
 
Kannst du das bitte näher erklären?

Ich habe anhand des Beispiels von illaX (http://www.tutorials.de/java/236645-objekte-im-netzwerk-senden-empfangen.html#post1234045) mein Senden/Empfangen aufgebaut und nur noch um einen Buffer erweitert, damit das ganze nicht so lahm ist. Habe ich dabei etwas falsches getan?

Beim Senden, sende ich solange, wie der FileInputStream etwas hergibt, dabei ist die Variable fileSize nur zum Kontrollieren da wieviel tatsächlich gesendet wurde.
Beim Empfangen, empfange ich solange, wie die zuvor empfangene Größe der Datei noch nicht erreicht wurde. Für die Abfrage dient hier die fileSize Variable.

Beim Senden und Empfangen geh ich davon aus, dass i die Größe des Pakets (byte[]) ist, dass ich versende.

Ist das soweit richtig?


++++ Update ++++
"Lösung" -->
Der Transfer wird ganz offensichtlich von meinem Program gestört. Ich weiß nicht wie aber in diesem Fall ist die Lösung simpel...
Ich erstell für den Transfer einen neuen Socket mit eigenem Port, sodass der Transfer unabhängig von der restlichen Kommunikation stattfindet.
ist denke ich auch von der Programmierung besser, wenn dies getrennt voneinander passiert.
 
Zuletzt bearbeitet:
Zurück