Server-Thread schreibt nicht alle Dateien

Diskutiere Server-Thread schreibt nicht alle Dateien im Allgemeine Java-Themen Bereich.
W

wwwmarc

Hallo, ich habe folgendes Problem.

Ich habe einen Client und einen Server. Der Client liest eine Bilddatei ein und sendet sie an den Server. Es wird alles erfolgreich an den Server geschickt (soweit es für mich ersichtlich war), der Thread im Server beendet sich jedoch einfach nach ein paar Bytes. Bei kleinen Bildern funktioniert alles super, bei großen Bilden treten die geschilderten Probleme auf

Anbei einmal den Code.

P.S: Ich lerne gerade erst Netzwerkprogrammierung

Client:
Java:
public static void sendeBild(OutputStream out)  {
        try {
            InputStream in = new FileInputStream("C:\\Users\\mblan\\Desktop\\Hallo.png");
            byte[] buffer = new byte[1024];
            while(in.available() > 0)  {
                int bytesRead = in.read(buffer);
                if(bytesRead == -1) break;
                out.write(buffer, 0, bytesRead);
                System.out.println(bytesRead);
            }
            in.close();
            System.out.println("Bild gesendet");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Server:
Java:
try {
                                System.out.println("[Server] Bild angekommen");
                                InputStream in = ServerBild.inputBild.get(meineVerbindungsNummer);
                                FileOutputStream fileIO = new FileOutputStream("C:\\Users\\mblan\\Desktop\\Bild1.png");
                                byte[] buff = new byte[1024];
                                while(in.available() > 0)  {
                                    int bytesRead = in.read(buff);
                                    fileIO.write(buff, 0, bytesRead);
                                    System.out.println("[Server]" + bytesRead);
                                }
                                
                                System.out.println("[Server] fertig");
                                fileIO.close();
                                
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
 
T

TM69

Ohne mir heute Abend noch das Programm näher zu untersuchen, kann ich dir ein paar Tips geben, woran es liegen könnte:

- Deadlock
Ein Prozess verliert und muss warten, bis der andere abgeschlossen ist. Ein Deadlock tritt auf, wenn die Warteschlange noch an einer bestimmten Stelle festhält

- Livelock
Livelock, tritt auf, wenn zwei oder mehr Prozesse als Reaktion auf Änderung in dem anderen Prozess warten. ohne nützliche Arbeit zu leisten. Diese Prozesse befinden sich nicht im Wartezustand und werden gleichzeitig ausgeführt. Dies unterscheidet sich von einem Deadlock, da sich in einem Deadlock alle Prozesse im Wartezustand befinden.

- Starvation
Im Starvation verhungern die Thread, da sie aufeinander warten, . Aber hier ist die Wartezeit nach einer gewissen Zeit nicht unendlich. Der wartende Thread erhält immer die Ressourcen, die für die Ausführung der Thread-Methode run () erforderlich sind.

Achte insbesondere auch darauf das die verwendeten Funktionen threadsafe sind.
 
W

wwwmarc

Ich vermute mal, dass

im Server false zurückliefert, wenn der Client die Daten nicht schnell genug schickt.
Vielen Dank, deine Vermutung war richtig.

Ich habe anschließend mal eine while(true) Schleife laufen lassen und die Methode in.available() in eine if gepackt. Jetzt funktioniert alles wie es soll.

Leider ist die Lösung sicher nicht die eleganteste
 
L

LimDul

Das Problem ist, für Netzwerkverkehrt ist available() nicht geeignet:
Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.
Die liefert dir die Anzahl Bytes zurück, die non blocking gelesen werden können. Bei Netzwerkverkehr kann es aber sein, dass gerade kein Input da ist, aber man halt warten will, bis Daten da sind (da will man also oft blocking Operations haben)

Das heißt, anstelle avaiable abzufragen, kannst du auch einfach read aufrufen. Wenn da -1 zurückkommt, ist das Ende des Streams erreicht und das Bild vollständig.
 
W

wwwmarc

Das Problem ist, für Netzwerkverkehrt ist available() nicht geeignet:

Die liefert dir die Anzahl Bytes zurück, die non blocking gelesen werden können. Bei Netzwerkverkehr kann es aber sein, dass gerade kein Input da ist, aber man halt warten will, bis Daten da sind (da will man also oft blocking Operations haben)

Das heißt, anstelle avaiable abzufragen, kannst du auch einfach read aufrufen. Wenn da -1 zurückkommt, ist das Ende des Streams erreicht und das Bild vollständig.
Probiere ich mal aus. Danke :)
 
W

wwwmarc

Eure Hilfen waren bisher super. Aber eins verstehe ich nicht so ganz. Wenn ich im Client ein Bild einlese und das Ende erreicht ist, wird -1 zurück gegeben und diese Zahl möchte ich zusätzlich schicken. Beim Server kommt aber 1 an. Also keine negative, sondern eine positive Zahl. Es ist nicht weiter schlimm, würde nur gerne verstehen warum das so ist. Vielleicht kann es mir kurz einer erklären. Vielen Dank :)
 
Thema: 

Server-Thread schreibt nicht alle Dateien

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben