Nach Dateiversand werden keine Nachrichten mehr übertragen

J

Javax123

Gast
Hallo,

ich übertrage eine Datei mittels einer Socket Verbindung von 2 Java Anwendungen folgendermaßen:

Server (Senden):

Code:
byte[] buffer = new byte[16384];
InputStream inputStream = new FileInputStream(f);
OutputStream outputStream = client.getOutputStream();
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
  outputStream.write(buffer, 0, len);
}

Client (Empfangen):

Code:
byte[] buffer = new byte[16384];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fs.write(buffer, 0, len);
}

Wobei hier "fs" der FileOutputStream und is der InputStream des Sockets darstellt.

Das ganze funktioniert auch wunderbar. Das Problem ist jedoch wenn ich nun danach vom Server nochmal eine Nachricht absende, etwa per "outputStream.write(987654321);" und versuche die danach auf der Client Seite wieder mit "int test = is.read();" zu lesen, kommt diese nicht mehr an.

Hat jemand eine Idee was ich dabei falsch mache?

Vielen Dank!
 
S

SlaterB

Gast
du verwendest eine Standardschleife, die bis -1, also Stream-Ende liest,
das passiert wirklich zum Ende der Verbindung, nicht bis du beim Server mit der Schleife oder einer bestimmten Methode fertig bist, wie soll der Client das erkennen?
verwende Protokolle, sende z.B. vor der Datei die Anzahl der folgenden bytes an Daten, dann die Schleife nicht bis -1, sondern nur bis genug Daten gelesen sind oder ähnliches
 
Zuletzt bearbeitet von einem Moderator:
J

Javax123

Gast
Hey Slater,

danke für deine Antwort, das ganze klingt auch recht Einleuchtend, nur dachte ich bisher das der Sendevorgang dadurch beendet ist wenn die Array Länge des Bytes Array durchlaufen wurde.

Kannst du mir ganz grob Beispielhaft zeigen wie ich die Schleife so ummodellieren kann das er die Länge richtig wählt? Ich kann mir das grade leider nicht wirklich vorstellen, wäre dir wirklich sehr dankbar!

Gruß
 
S

SlaterB

Gast
du hast alle Zeit der Welt zum Nachdenken und Ausprobieren,
das fängst schon mit einer einfachen Datei von 5 Bytes ab, ganz ohne Schleife,
wenn du nichts an Code selber schreibst oder konkrete Fragen stellst, dann sehe ich keinen Sinn darin irgendwas vorzugeben,

dass die len-Variable Information über die Anzahl gelesener Zeichen enthält ist dir schon bekannt,
oder ist der jetztige Code auch bereits nur irgendwo kopiert?
ich habe leider kein Interesse, für dich zu programmieren
 
J

Javax123

Gast
Hi,

also mit folgenden Code sende ich ja die Datei:

Code:
     		while ((len = inputStream.read(buffer)) > 0) {
				outputStream.write(buffer, 0, len);
				System.out.println(len); // Habe ich eingebaut um die Anzahl der Zeichen zu prüfen
			}

Durch die Ausgabe sehe ich das bei meiner kleinen Datei nur ein Schleifendurchgang benötigt wird da es sich laut Ausgabe um 12935 Zeichen also Byte handelt.

Nun will ich also davor die Zeichenlänge mitschicken um auf Client Seite dann so lange empfangen zu können bis alle Zeichen durchlaufen sind.

Deswegen habe ich durch

Code:
			int fileSize = (int)f.length();
			outputStream.write(fileSize);

versucht die Dateigröße in Bytes zu ermitteln... komischerweise bekomme ich hier allerdings einen Bytewert von 135 zurück, das müssten doch aber theorertisch gleich viel Bytes sein oder? Also die Dateigröße und die Zeichen einer Datei die eiingelesen werden..?

Danke
 
S

SlaterB

Gast
prüfe doch erstmal beim Sender, was das eingelesene fileSize ist,
wenn du noch nicht weißt, ob dieser Wert 125 oder der korrekte ist, dann wäre das für dich und alle eine wichtige Info,
wenn du es schon weißt, dann teile es allen anderen mit

vermutlich ist der Fehler: du schreibst die File-Size als int, das sind 4 Bytes, liest aber auf Empänger-Seite nur ein Byte davon,
verwende evtl. DataInputStream readInt()

edit:
wobei das Senden mit
outputStream.write(fileSize);
auch schon falsch sein könnte, da wird vielleicht nur ein Teil des ints verschickt, nur ein Byte,
verwende da auch DataOutputStream
 
J

Javax123

Gast
Hey! Großes Dankeschön an dich! Mit dem DataOutputWriter hat das ganze funktioniert! Ich handle das auf Client Seite nun folgendermaßen:

Code:
			DataInputStream dis = new DataInputStream(is);
			int fileSize = dis.readInt();
			
			// Datei-Inhalte schreiben:
			byte[] buffer = new byte[16384];
			int len = 0;
			while ((len = is.read(buffer)) != -1) {
				fs.write(buffer, 0, len);
				if (len == fileSize)
				{
					break;
				}
			}	

			fs.flush();
			fs.close();

			System.out.println(br.readLine());

Und nun kommen auch bei der letzten Ausgabe in der letzten Zeile die Daten an die ich nach dem File gesendet habe =)

Danke!!
 
S

SlaterB

Gast
is.read(buffer)
hier musst du das Lesen maximal auf die noch offenen bytes beschränken, also zusätzlichen Parameter übergeben und zwischendurch ständig rechnen,
sonst liest du vielleicht zu viel ins Array, falls direkt danach weitere Daten folgen

überhaupt musst du in der Schleife die len-Werte addieren
 
J

Javax123

Gast
Ich hatte es zuerst probiert in dem ich hier anstatt
Code:
len = is.read(buffer)) != -1

auf
Code:
 len = is.read(buffer)) != fileSize

abgefragt hatte, dann ist mir das allerdings immer abgestürzt ...
 
S

SlaterB

Gast
in deinem Beispiel für mich nicht ganz verständlich falls danach der Vergleich 'len == fileSize' funktioniert,
letzlich aber eh keine gute Lösung, denn wegen der Schleife kommt ja grundsätzlich angenommen nicht alles auf einmal an usw.
 
J

Javax123

Gast
Also du meinst dann quasi auf der Serverseite schon die Anzahl der benötigten Schleifendurchgänge berechnen und diese als Parameter mitschicken?
 
S

SlaterB

Gast
nein, das ist unnötig, zumal auch noch abhängig von der Buffer-Größe, die nicht übereinstimmen muss,

der Server sagt nur dass 100.000 Daten kommen,
der Client kann nun 100.000x ein Byte lesen, versuchen ein genau passendes 100.000er-Array zu lesen
oder in einer Schleife ein beliebiges Array,
wenn beim ersten Schleifendurchlauf 8000 Bytes reinkommen dann kann man doch leicht ausrechnen dass noch 92.000 über sind, die Schleife noch nicht zu beenden ist,
das kriegt der Client, also du beim Client-Programmieren, alles hin, nur anstrengen

wenn die Gesamtmenge nicht bekannt ist kann der Client nicht zaubern, andere Dinge sind aber gut berechenbar
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dann07 Audio streamen bricht immer ab nach kurzer Zeit Netzwerkprogrammierung 6
G seite nach posten eines html-forms laden Netzwerkprogrammierung 0
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
C Gerenderte Website nach der ausführung von JavaScript als HTML Code aus lesen Netzwerkprogrammierung 4
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
B Nach Verbindung gleich ObjectStream empfangen Netzwerkprogrammierung 1
L Verzeichnisse mit Inhalt nach SMB-Share kopieren Netzwerkprogrammierung 16
N HTTP Apache 4.2.1 HttpClient 302 nach Login und auf den weiteren Seiten. Netzwerkprogrammierung 5
K Socket Chat-GUI eigenes Event nach Empfangen Netzwerkprogrammierung 2
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
P Datenpakete nach Australien Netzwerkprogrammierung 7
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
J Nachricht kommt erst nach beendigung der Anwendung an Netzwerkprogrammierung 4
D Socket Automatischer Reconnect nach einem Disconnect. Netzwerkprogrammierung 4
S Socket nach anderen clients im netzwerk suchen Netzwerkprogrammierung 3
B IP nach gewissen Kriterien überprüfen Netzwerkprogrammierung 5
V JNLP startet nicht !!?!! (je nach PC) Netzwerkprogrammierung 1
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
DeviAn Über ein Linux Server ein Windows Server nach einer File fragen Netzwerkprogrammierung 6
Q Datein von Windows nach Mac senden Netzwerkprogrammierung 4
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
T Zugriffsverweigerung nach Dateitransfer Netzwerkprogrammierung 7
T Nach Servern suchen Netzwerkprogrammierung 2
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
L nach Servern suchen Netzwerkprogrammierung 2
M ordner nach socket-übertragung defekt Netzwerkprogrammierung 5
B Im eingelesenen Text nach einem Wort suchen Netzwerkprogrammierung 46
M serialisierung funktioniert nur nach neuer instanzierung Netzwerkprogrammierung 3
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
A Client stürzt nach versand ab Netzwerkprogrammierung 13
M Verbindung nach Serverabsturz wieder aufbauen Netzwerkprogrammierung 9
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8
G Port belegt nach Server restart Netzwerkprogrammierung 5
G Socket wird nach Portscann geschlossen Netzwerkprogrammierung 2
N Verarbeitung nach Weiterleitung in Sockets Netzwerkprogrammierung 2
L Frage nach Socket Netzwerkprogrammierung 4
S Problem mit Dateiversand Abbruch. Netzwerkprogrammierung 4
K Java RMI bricht ab wenn Remote eine Methode ausgeführt werden soll Netzwerkprogrammierung 5
S Umlaute wie ê in sms werden als ? zeichen dargestellt Netzwerkprogrammierung 4
T DataOutputStream Nachrichten werden fehlerhaft gesendet. Netzwerkprogrammierung 1
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
F Reader/ Writer werden nicht geschlossen Netzwerkprogrammierung 2
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
B Methoden und Konstruktoren von Java.net package werden nicht geladen Netzwerkprogrammierung 2
A Socket ASCii Zeichen werden nicht per udp übermittelt. please help . Netzwerkprogrammierung 6
H HTTP Header Response kann nicht ausgelesen werden Netzwerkprogrammierung 4
V Socket Objekte werden nicht aktualisiert Netzwerkprogrammierung 2
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
Semox HTTP Webserver: Externe Dateien werden nicht verwendet. Netzwerkprogrammierung 10
T Laufen Objekte, die vom Cajo-Server geliefert werden, lokal auf dem Client? Netzwerkprogrammierung 4
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
OliverKroll Wie kann mit Java und CORBA der Ausfall des Servers abgefangen werden ? Netzwerkprogrammierung 9
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
D Lange Zeilen in Emails werden umgebrochen Netzwerkprogrammierung 2
A Wie werden Daten versendet? "Crashcode" Netzwerkprogrammierung 4
G CORBA Klassen werden nicht erkannt. Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben