Problem beim Übertragen einer Datei

Status
Nicht offen für weitere Antworten.

Rontu

Mitglied
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.
 
T

tuxedo

Gast
Klar hab ich ne Idee:

Wenn du am Server auf die Zeit wartest die der Client für's senden gebraucht hat, und dieser die Zeit nicht sendet wartet sich der Server zu Tode. Und weil er sich zu tode wartet schließt er die Verbinmdung nicht. Und weil er die Verbindung nicht schließt kommt der Client zu keinem Ende weil der Client auf's schließen der Verbindung durch den Server wartet.

Ein Teufelskreis ...

- Alex
 

Rontu

Mitglied
Also wenn ich dich richtig verstanden habe muss ich auf der Server-Seite den OutputStream schließen, nachdem ich die Datei übertragen habe. Wenn ich das mache läuft das Programm weiter, jedoch schließt der scheinbar dadurch auch direkt meinen Socket. Gibt es denn eine Möglichkeit den Stream zu beenden, jedoch den Socket geöffnet zu lassen?
 

Pappenheimer++

Bekanntes Mitglied
Mach das doch einfach so: Am Anfang überträgt der Server erstmal die Größe der Datei in Byte. Dann weiß der Client auch, wann Schluss ist (ohne im bio hängen zu bleiben). Dann kannst du noch irgendwelche Abschlussinformationen übertragen lassen und alles klappt ganz goat ~
 
T

tuxedo

Gast
Ihr stellt euch an. Lass doch den Client einfach das senden worauf der Server wartet...
Macht ja keinen Sinn nur halbe Sachen zu implementieren und sich dann zu wundern dass nur die hälfte geht.

- Alex
 

Rontu

Mitglied
alex0801 hat gesagt.:
Ihr stellt euch an. Lass doch den Client einfach das senden worauf der Server wartet...

Dann erklär mir doch bitte, wie ich aus der Schleife springe, nachdem die Datei übertragen wurde, oder woran genau das liegt. Scheinbar kennst du darauf ja ne Antwort.
Es kann doch nicht sein, dass die komplette Datei geschrieben wird und er anschließend trotzdem nicht aus der Schleife springt, obwohl gar keine Daten mehr aus dem Stream ausgelesen werden können.
 

Rontu

Mitglied
Read liest das nächste Byte aus, oder liefert -1 wenn keine Daten mehr gelesen werden können. Das ist mir auch klar. Aber der Server läuft doch durch, er liest alle Daten der übertragenen Datei aus und verschickt sie über den Stream an den Client. Dort tritt ja das Problem auf.
 
T

tuxedo

Gast
@Rontu:

read() bricht im Client erst ab, wenn der Stream abbricht, sprich beendet wurde. Und nicht wenn der Server aufhört bytes zu senden. Und der Stream wird nunmal vom Server abgebrochen. Aber erst, wenn der Client ihm mitgeteilt hat, wie lange er für das Empfangen gebraucht hat.

Verstehst du die Problematik? Die warten gegenseitig auf sich -> Deadlock.

Mach's doch, wie weiter oben schon erwähnt wurde so:

Bevor der Server die Datei an den Client schickt, schickt er ihm mittels DataOutputStream einen Long-Wert, der dem Client signalisiert: Jetzt kommt eine Datei die XYZ Byte groß ist.
Erst dann schickt der Server die Bytes der Datei durch den Stream. Der Client weiß, bevor die Datei kommt genau, wieviele Bytes er empfangen muss. D.h. du kannst einen Zähler in deiner Schleife mitlaufen lassen und die Schleife abbrechen wenn der Zähler "voll" ist.
Vor der Schleife merkst du dir System.currentTimeMillis(), danach nochmal und errechnest die Differenz. Die errechnete Differenz überträgst du dann wieder mit dem DataOutputStream als Long (oder als int, würde aber long nehmen, sicher ist sicher) zum Server. Der Server, der mittlerweile die Datei komplett gesendet hat, wartet ja schon auf den Zeitwert. Diesen bekommt er nun vom Client und kann die Stream und den Socket schließen.

Fertig. Ist doch kein Hexenwerk. Man muss halt nur die API Doc lesen können und kapieren wann read() abbricht.

- Alex
 

Rontu

Mitglied
Ah, jetzt hab ich das Problem auch verstanden und hab kappiert wie das abgearbeitet werden muss. Hab es auch schon wie beschrieben umgesetzt und es funktioniert alles einwandfrei. Vielen Dank.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
M Problem beim Datenempfang Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
J Problem beim Senden von File Netzwerkprogrammierung 4
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
P problem beim schließen eines Streams Netzwerkprogrammierung 6
C Session Problem beim Zugriff auf Webseiten Netzwerkprogrammierung 3
I Apache http-client: Problem beim Proxyaufruf Netzwerkprogrammierung 2
C RMI: Problem beim Aufruf einer Methode. Falsch gecastet? Netzwerkprogrammierung 8
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
R Problem beim Senden von Emails (Javamail) Netzwerkprogrammierung 2
M problem beim schicken von XML-DAtenpacketen via TCP Netzwerkprogrammierung 3
D Performance Problem beim File senden, empfangen Netzwerkprogrammierung 4
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
J Socket Client - Server Problem Netzwerkprogrammierung 4
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
AlexSpritze Authentication Problem bei WebServices Netzwerkprogrammierung 4
J Socket Problem -Proxies Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
F Konzept Problem Netzwerkprogrammierung 12
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
W RMI Problem Netzwerkprogrammierung 4
M Problem mit Server Netzwerkprogrammierung 5
N Socket Java server c# client problem Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben