Datei senden/empfangen funzt nicht...

1

1243sdf

Gast
Datei soll von Server zu Client geschickt werden.

Datei kommt zwar an, jedoch nur beschädigt mit 5 bytes (4KB sollte sie eigl. groß sein).

Danke!

Server:

Java:
    public static void transferFile(File file, Socket client) {
        try {
            int b = 0;
            byte[] buffer = new byte[1024];
            OutputStream out = client.getOutputStream();

            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            DataInputStream dis = new DataInputStream(bis);

            while (b != -1) {
                b = dis.read(buffer);

                out.write(b);
                out.flush();
            }
        }
        catch (FileNotFoundException exc) {
            exc.printStackTrace();
        }
        catch (IOException exc) {
            exc.printStackTrace();
        }
    }

Client:

Java:
    public static void receiveFileFromServer(File targetFile) {

        try {
        InputStream in = Main.get().getSession().getConnection().getInputStream();
        FileOutputStream fileOut = new FileOutputStream(targetFile);

        byte[] buffer = new byte[1024];
        while (Main.get().getSession().getConnection().getSocket().isConnected()) {
            int bytesRead = in.read(buffer);
            if (bytesRead == -1) break;
            fileOut.write(buffer, 0, bytesRead);
        }

        fileOut.close();
        }
        catch (FileNotFoundException exc) {
            exc.printStackTrace();
        }
        catch (IOException exc) {
            exc.printStackTrace();
        }
    }
 

The_S

Top Contributor
Du schickst beim Server den Rückgabewert von dis.read() und nicht den Puffer, in welchen du dis.read schreiben lässt.
 
A

adsfgwdaz

Gast
Nun scheint es ein wenig geklappt zu haben, jedoch nicht wirklich.

Nochmal zum Gesamtzusammenhang: In einer Chatsoftware soll der Server alle Avatare seiner Freunde an ihn schicken, damit sie in der Freundesliste dargestellt werden können.

Probleme:

1. Ich hab noch nie wirklich mit dem Versenden von Datein gearbeitet und versuche mich da durchzuhangeln.
2. Bild kommt an, jedoch laut Windows (7) Explorer mit 0 Bytes, das Thumbnail im Explorer funktioniert aber. Kann das Bild über die Windows-Bildanzeige auch ansehen, öffne ich es aber zb. mit Fireworks, meldet er mir einen Fehler.
3. Führe ich diesen Vorgang (unten) pro Freund aus der Freundesliste aus, so empfange ich immer nur eins und die Bilder werden dann nicht ersetzt, sondern wachsen in der KB-Anzahl.


Zum Sachverhalt:

Client sendet an Server eine Nachricht, um ein Bild anzufordern.

Java:
            try {
// Loginname and password is necessary for this action
                String loginname = Main.get().getSession().getUsername();
                String password = Main.get().getSession().getPassword();
                
                ClientUserPictureRequestMessage cuprm = new ClientUserPictureRequestMessage(loginname, password);
                cuprm.setOwner(username);
                
                Main.get().getSession().getConnection().getObjectOutputStream().writeObject(cuprm);
            }
            catch (java.io.IOException exc) {
                exc.printStackTrace();
            }

Server empfängt diese Nachricht, reagiert darauf und sendet eine Antwortnachricht und sendet dann das Bild.

Java:
public static void handleMessage(ClientMessage cm, ClientConnection cc) {
...
if (cm instanceof ClientUserPictureRequestMessage) {
                            ClientUserPictureRequestMessage cuprm = (ClientUserPictureRequestMessage) cm;
                            
                            if (UserManager.areFriends(cc.getUser(), UserManager.getDetailedUserByName(cuprm.getOwner()))) {
                                DetailedUser user = UserManager.getDetailedUserByName(cuprm.getOwner());

                                ServerUserPictureAnswerMessage supam = new ServerUserPictureAnswerMessage();
                                supam.setUsername(user.getUsername());

                                if (user.getUserPictureID() != null || user.getUserPictureID().equals("")) {
                                    // Settings
                                    supam.setUseDefaultPicture(false);
                                    supam.setSuccess(true);

                                    // Send answer object
                                    cc.getObjectOutputStream().writeObject(supam);

                                    // Send user picture
                                    File userPicture = new File(Main.get().getAppdataPath().getAbsolutePath() + "\\userPics\\" + user.getId() + ".png");
                                    FileTransferManager.transferFile(userPicture, cc.getSocket());
                                }
                                else {
                                    // Settings
                                    supam.setUseDefaultPicture(false);
                                    supam.setSuccess(true);

                                    // Send answer object
                                    cc.getObjectOutputStream().writeObject(supam);
                                }
                            }
                            else {
                                ServerUserPictureAnswerMessage supam = new ServerUserPictureAnswerMessage();
                                supam.setSuccess(false);

                                cc.getObjectOutputStream().writeObject(supam);
                            }
                        }
...
}

So wird das Bild gesendet:

Java:
public class FileTransferManager {

    public static void transferFile(File file, Socket client) {
        try {
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            OutputStream out = client.getOutputStream();

            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            DataInputStream dis = new DataInputStream(bis);

            while (bytesRead != -1) {
                bytesRead = dis.read(buffer);

                if (bytesRead != -1) {
                    out.write(buffer, 0, bytesRead);
                    out.flush();
                }
            }
        }
        catch (FileNotFoundException exc) {
            exc.printStackTrace();
        }
        catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}

Dann empfängt der Client die Nachricht:

Java:
if (sm instanceof ServerUserPictureAnswerMessage) {
            ServerUserPictureAnswerMessage message = (ServerUserPictureAnswerMessage) sm;

            if (!message.isUsingDefaultPicture()) {
                File userPictureFile = new File(Main.get().getAppdataPath().getAbsolutePath() + "\\userPics\\" + message.getUsername() + "." + message.getExtension());
                userPictureFile.delete();
                FileTransferManager.receiveFileFromServer(userPictureFile);
            }
        }

Und so wird dann das Bild empfangen:

Java:
public class FileTransferManager {

    public static void receiveFileFromServer(File targetFile) {

        try {
            InputStream in = Main.get().getSession().getConnection().getInputStream();
            FileOutputStream fileOut = new FileOutputStream(targetFile);

            byte[] buffer = new byte[1024];
            while (Main.get().getSession().getConnection().getSocket().isConnected()) {
                int bytesRead = in.read(buffer);
                if (bytesRead == -1) break;
                fileOut.write(buffer, 0, bytesRead);
            }

            fileOut.close();
        }
        catch (FileNotFoundException exc) {
            exc.printStackTrace();
        }
        catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}
 

The_S

Top Contributor
Zum Sachverhalt:

Client sendet an Server eine Nachricht, um ein Bild anzufordern.

Java:
            try {
// Loginname and password is necessary for this action
                String loginname = Main.get().getSession().getUsername();
                String password = Main.get().getSession().getPassword();
                
                ClientUserPictureRequestMessage cuprm = new ClientUserPictureRequestMessage(loginname, password);
                cuprm.setOwner(username);
                
                Main.get().getSession().getConnection().getObjectOutputStream().writeObject(cuprm);
            }
            catch (java.io.IOException exc) {
                exc.printStackTrace();
            }

Server empfängt diese Nachricht, reagiert darauf und sendet eine Antwortnachricht und sendet dann das Bild.

Java:
public static void handleMessage(ClientMessage cm, ClientConnection cc) {
...
if (cm instanceof ClientUserPictureRequestMessage) {
                            ClientUserPictureRequestMessage cuprm = (ClientUserPictureRequestMessage) cm;
                            
                            if (UserManager.areFriends(cc.getUser(), UserManager.getDetailedUserByName(cuprm.getOwner()))) {
                                DetailedUser user = UserManager.getDetailedUserByName(cuprm.getOwner());

                                ServerUserPictureAnswerMessage supam = new ServerUserPictureAnswerMessage();
                                supam.setUsername(user.getUsername());

                                if (user.getUserPictureID() != null || user.getUserPictureID().equals("")) {
                                    // Settings
                                    supam.setUseDefaultPicture(false);
                                    supam.setSuccess(true);

                                    // Send answer object
                                    cc.getObjectOutputStream().writeObject(supam);

                                    // Send user picture
                                    File userPicture = new File(Main.get().getAppdataPath().getAbsolutePath() + "\\userPics\\" + user.getId() + ".png");
                                    FileTransferManager.transferFile(userPicture, cc.getSocket());
                                }
                                else {
                                    // Settings
                                    supam.setUseDefaultPicture(false);
                                    supam.setSuccess(true);

                                    // Send answer object
                                    cc.getObjectOutputStream().writeObject(supam);
                                }
                            }
                            else {
                                ServerUserPictureAnswerMessage supam = new ServerUserPictureAnswerMessage();
                                supam.setSuccess(false);

                                cc.getObjectOutputStream().writeObject(supam);
                            }
                        }
...
}

Java:
if (sm instanceof ServerUserPictureAnswerMessage) {
            ServerUserPictureAnswerMessage message = (ServerUserPictureAnswerMessage) sm;

            if (!message.isUsingDefaultPicture()) {
                File userPictureFile = new File(Main.get().getAppdataPath().getAbsolutePath() + "\\userPics\\" + message.getUsername() + "." + message.getExtension());
                userPictureFile.delete();
                FileTransferManager.receiveFileFromServer(userPictureFile);
            }
        }

Dein Dateitransfer schaut erst einmal soweit OK aus. Konnte zumindest beim drüberschauen auf die schnelle nichts falsches sehen (außer evtl. ein paar recht umständliche Codezeilen, die aber trotzdem funktionieren sollten). Könnte es sein, dass dein Fehler deshalb wo anders, bspw. in den von mir zitierten Codestellen liegt? Da ich deine ganzen Objekte und Klassen nicht kenne, kann ich nicht sagen, ob da oben was schief läuft oder nicht.

1. Ich hab noch nie wirklich mit dem Versenden von Datein gearbeitet und versuche mich da durchzuhangeln.
2. Bild kommt an, jedoch laut Windows (7) Explorer mit 0 Bytes, das Thumbnail im Explorer funktioniert aber. Kann das Bild über die Windows-Bildanzeige auch ansehen, öffne ich es aber zb. mit Fireworks, meldet er mir einen Fehler.
3. Führe ich diesen Vorgang (unten) pro Freund aus der Freundesliste aus, so empfange ich immer nur eins und die Bilder werden dann nicht ersetzt, sondern wachsen in der KB-Anzahl.

1. Aller Anfang ist schwer
2. Schickst du evtl. in einem Format und speicherst in einem anderen? Überschreibst du die Bilder gleich wieder? Hast du mal "in das Bild" geguckt, ob wirklich 0 Bytes drinstehen? Der Fehler wäre natürlich auch interessant.
3. Dann übergibst du wohl immer wieder den selben Dateinamen als Ziel bzw. schickst du die Datei so, so dass der Empfänger das alles als "Ein Bild" interpretiert. Könnte auch sein, dass hiermit dein anderer Fehler zusammenhängt.
 

HoaX

Top Contributor
Ich würde sagen dein Fehler liegt da, dass du beim Empfangen der Bilder auf -1 wartest beim read. Dieser Fall tritt erst dann auf die Verbindung getrennt wird, nicht dann, wenn die Gegenstelle nichts mehr zu senden hat (für den Augenblick). Darum landen dann auch alle Bilder in einer Datei.
 

The_S

Top Contributor
Ich würde sagen dein Fehler liegt da, dass du beim Empfangen der Bilder auf -1 wartest beim read. Dieser Fall tritt erst dann auf die Verbindung getrennt wird, nicht dann, wenn die Gegenstelle nichts mehr zu senden hat (für den Augenblick). Darum landen dann auch alle Bilder in einer Datei.

Stmmt, das hatte ich übersehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Datei senden und empfangen Netzwerkprogrammierung 4
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
T Datei senden Netzwerkprogrammierung 3
G Datei über HTTP Stream senden Netzwerkprogrammierung 4
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
J Datei Download vom Server Netzwerkprogrammierung 8
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
Aruetiise Socket Datei Endung Netzwerkprogrammierung 6
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
K HTTP Formulare füllen und Datei downloaden Netzwerkprogrammierung 23
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
A Datei erzeugen und auf der Weboberfläche downloaden (Tomcat) Netzwerkprogrammierung 4
Sogomn HTTP Datei herunterladen Netzwerkprogrammierung 13
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
F FTP Einzelne Datei von FTP-Server überprüfen Netzwerkprogrammierung 0
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
S Datei(XML) per RMI an Server schicken Netzwerkprogrammierung 0
V Datei Download Fenster Netzwerkprogrammierung 9
S Datei schreiben über Applet Netzwerkprogrammierung 8
C Socket Datei Übertragung Netzwerkprogrammierung 5
D Datei hochladen zu PHP Server Netzwerkprogrammierung 8
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
H Datei in DropBox schreiben Netzwerkprogrammierung 23
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
V Datei auf Server Schreiben Netzwerkprogrammierung 18
N Einen Server als ausführbare Datei exportieren Netzwerkprogrammierung 15
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
C Datei auf server speichern Netzwerkprogrammierung 16
P FTP Nochmal wachsende Datei per FTP lesen Netzwerkprogrammierung 9
W Datei automatisiert kopieren! Netzwerkprogrammierung 5
P Wachsende Datei per FTP lesen Netzwerkprogrammierung 2
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
G Txt datei von Website downloaden Netzwerkprogrammierung 8
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
S ActiveMQ, JMS und Datei übertragen Netzwerkprogrammierung 25
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
U Web Datei downloaden und bei Änderungen wieder zurückspielen Netzwerkprogrammierung 5
M Class-Datei aus Eclipse mit Xampp Netzwerkprogrammierung 4
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
B Zugriff auf eine Text- und XML-Datei Netzwerkprogrammierung 4
Dit_ FTP, Datei Hochladen Netzwerkprogrammierung 4
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
J Datei übertragen ja String + datei übertragen nein Netzwerkprogrammierung 5
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
N Socket TCP Datei Transfer Netzwerkprogrammierung 2
L Java über php datei lesen? Netzwerkprogrammierung 18
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
weeego Ping über CMD, Umweg über Batch Datei sparen. Netzwerkprogrammierung 17
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
S StringArray in .txt Datei --> langsam wegen Client/Server!? Netzwerkprogrammierung 16
U Datei via UDP Netzwerkprogrammierung 8
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
S Error 404 obwohl die Datei existiert Netzwerkprogrammierung 9
T Datei Herunterladen und ausführen Netzwerkprogrammierung 5
S Mittels Java XML abfragen und nicht die Ausgabe-HTML-Datei Netzwerkprogrammierung 5
C PCAP Datei auslesen Netzwerkprogrammierung 8
F Applet Datei Zugriff Netzwerkprogrammierung 13
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
M [Commons NET] Prüfen, ob auf FTP Datei vorhanden ist Netzwerkprogrammierung 2
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
C Dateiübertragung - Datei immer ein 4096faches von n Netzwerkprogrammierung 2
E Applet zum Datei-Upload Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
J Gibts die Datei? Netzwerkprogrammierung 3
K Datei-Upload per FTP Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
S über rmi datei übertragen? Netzwerkprogrammierung 2
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
G.I.Joe Datei per POST übertragen Netzwerkprogrammierung 2
B Umfangreiche Batch Datei (Rmiregistry prüfung + Prog. start) Netzwerkprogrammierung 4
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
B Via Java Datei zu PHP-Script auf Apache hochladen Netzwerkprogrammierung 4
B knacken bei download von mp3 datei Netzwerkprogrammierung 2
M Datei auf Remoteserver kopieren Netzwerkprogrammierung 8
B Datei speichern unter Netzwerkprogrammierung 10
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8
T Musik-Stream: Server sendet die Datei zu schnell ? Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben