Übertragung von Daten im Netzwerk macht Probleme

Rontu

Grünschnabel
Hallo zusammen,
ich habe ein kleines Problem mit einer Client/Server Kombination. Mein Server soll auf einen Client warten und wenn sich dieser anmeldet eine Datei verschicken. Auf der Clientseite wird diese empfangene Datei dann wieder auf die Festplatte geschrieben. Währenddessen soll der Client die Zeit messen, die für den Vorgang benötigt wird und diese nach erfolgreichem Empfang der Daten an den Server zurücksenden. Ist zwar noch nicht geschrieben, ist aber nicht das Problem, im Moment deshalb nur ein Platzhalter.
Jedoch bleibt meine Schleife, die die Daten empfängt nach Erhalt hängen und das Programm läuft nicht weiter. Merkwürdigerweise liegt jedoch die Datei schon komplett auf der Festplatte und ist mit dem Original auch identisch.

Hier mal ein Ausschnitt aus dem Client ...

Code:
public void run() {

            try {
                // Öffnen des Sockets, der zu schreibenden Datei,
                // den Streams und den benötigten Variablen
                Socket socket = new Socket(this.serverName, this.port);
                File file = new File("C:/Temp/" + this.fileName);
                FileOutputStream outStream = new FileOutputStream(file);
                InputStream inStream = socket.getInputStream();
                PrintWriter cltOut = new PrintWriter(socket.getOutputStream(), true);
                byte[] buffer = new byte[16384];
                int length = 0;
                int msg_time = 0;
                
                System.out.println("Verbindung zum Server hergestellt.");
                
                // Schreiben der empfangenen Daten in die Datei
                while ((length = inStream.read(buffer)) > 0) {
                    outStream.write(buffer, 0, length);
                }
                System.out.println("Datei empfangen.");
                
                // Übertragung der benötigten Zeit
                msg_time = 1093; // derzeit noch ein Testwert
                cltOut.print(msg_time);
                System.out.println("Uebertragungszeit: " + msg_time + " ms");

                // Schließen der Streams und des Sockets
                outStream.close();
                inStream.close();
                cltOut.close();
                socket.close();

            } catch (Exception e) {
                e.printStackTrace();
            }

... und der entsprechende Abschnitt aus dem Server

Code:
// Initialisierung der Streams und Variablen
FileInputStream fis = new FileInputStream(tmFile);
OutputStream os = socket.getOutputStream();
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
byte[] buffer = new byte[16384];
int bytesRead = 0;
int msg_time = 0;
                                
// Senden der Testdatei
while ((bytesRead = fis.read(buffer)) > 0) {
  os.write(buffer, 0, bytesRead);
}
System.out.println("Datei uebertragen.");
                                
// Empfangen der Übertragungsdauert
msg_time = Integer.valueOf(is.readLine());
System.out.println("Uebertragungszeit: " + msg_time + " ms");
                                
// Schließen der Streams
is.close();
fis.close();
os.close();

Wenn ich nur die Datei verschicke und keine Antwort sende, läuft der Client. Das gleiche Spiel auch bei dem Versenden der benötigten Zeit, wenn nur dieser Wert übertragen werden soll. Vielleicht hat jemand von euch eine Idee, wo mein Problem zu suchen ist. Bei Bedarf gibt es auch noch mehr Quelltext, es sollte aber eigentlich alles wichtige enthalten sein.
 
Hab die Lösung schon gefunden. Das Problem liegt am read(), weil der Client nicht weiß, dass noch weitere Daten kommen. Habe nun vorher per DataOutputStream dem Client einen Long-Wert mit der Dateilänge geschickt, damit dieser nach erhalt aller Daten die Schleife beenden kann. Darauf hin klappt auch der Rest wieder
 
Zurück