Datein versenden funktioniert nicht !

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo !

Ich habe eine Server/Client Anwendung geschrieben, mit der man einfach miteinander komunizieren kann. Jetzt sitze ich schon seit 3 Tagen bei meinem Problem und finde keine Lösung.

Mein Problem ist, wenn ich Datein versenden will, z.B. eine *.bmp Datei, dann list der InputStream von Java nur die ersten 4 Zeichen ein, weil ab den 5. Zeichen ein paar 0-Bytes gesendet werden, und sobald ein 0-Byte gesendet wird, hört der InputStream auf zu empfangen, weil er wahrscheinlich denkt das der Stream beendet sei (zum Empfangen)

Der Server ist in C und der Client in Java geschrieben, die Übertragung funktioniert enwandfrei, bis auf dieses Probelm mit dem 0-Byte...

Ich weiß wirklich nicht wie ich das Problem lösen kann, ich hoffe ihr könnt mir helfen :( bin wirklich am Verzweifeln.
 
T

tuxedo

Gast
Ein Wenig Code wäre hilfreich.

Offensichtlich hast du ja schon ein Problem was sich noch VOR dem versenden der Datei äußert. "Einlesen" über InputStream hört sich nämlich nach einem Filereader o.ä. an.

- Alex
 
G

Guest

Gast
Naja ein Problem das sich VOR dem versenden äußert ist nicht richitg, ich kann ja Daten versenden, aber sobald in der Datei ein 0Byte zum versenden ist, dann bricht java das einelsen über den InputSTream ab.

hier der Code vom Java Client, der die Datei empfängt und einlest, über einen Stream vom Socket.

Code:
/*Array mit 0 fuellen*/
						for(int i = 0; i < buffer.length; i++) {
							buffer[i] = 0;
						}
						iResult = br.read(buffer,0,buffer.length);
						System.out.println("eingelesene zeichen: "+iResult);
						
						for (char c: buffer) {
							System.out.print(c);
							
						}

Ich schicke den Server eine Anfrage bezüglich einer Datei die ich downloaden will, dann sendet mir der Server die Datei (im binary modus natürlich).

Wenn ich auf der Server-Seite statt einem 0-Byte z.b eine 1 versende, dann funktioniert alles super.

Ich hoffe ich habe mich verständlich genug ausgedrückt.
 
G

Guest

Gast
@edit

Dass das Probelm Serverseitig ist denke ich nicht. Denn dort lese ich einfach die Datei die verlangt wird (falls vorhanden) mit einem filestream ein, und verpacke dann die bytes in 512Byte Pakete und versende diese.

Das char-Array "buffer" in Java ist auch 512 Zeichen groß.
 
T

tuxedo

Gast
*moment*

Zeig mal n bisschen mehr "drum rum". Wie initialisiertst du dein "br" ?

Dein "seltsames" Array-Initialisieren kannst du dir sparen.

- Alex
 
G

Gast

Gast
Nein, alle anderen Funktionen gehen wundebar, nur des downloaden einer Datei bekomm ich nicht hin.

Wenn die Datei keine 0 Bytes enthält, funktioniert der download auch wie gewünscht, aber sobald ein 0 Byte vorkommt, bricht es ab.

Ich meinte damit VOR dem einlesen ist nicht richtig, weil ich ja einlese und Daten ausgebe, aber wenn z.b Byte nr. 1025 ein 0 Byte ist, dann bricht der Download erst dort ab, und es werden die ersten 2 512Byte blöcke geschickt.

Das Array hab ich zu testzwecken mit 0 gefüllt, weil ich vorhin versucht habe, anstatt eines 0 Bytes eine 1 vom Server zu versenden, so hats auch geklappt, aber dann wär der Sourcecode der Datei eben falsch.

Vielleicht hab ich mich blöd ausgedrückt, mit einelsen meinte ich nicht die Datei direkt einelsen, sondern den bytstream der vom Server gesendet wird.

Die Datei wird auf den Server richtig und vollständig einglesen.
 
T

tuxedo

Gast
Würde das eigentlich so machen:

Code:
FileOutputStream fos = new FileOutputStream(new File("c:/x.xxx"));
		
		InputStream in = null; // hier halt deinen InputStream vom Socket. Würde keinen "BufferedReader" benutzen!
	
		byte[] buffer = new byte[128]; // Die puffergröße ist nahezu "schnuppe"
		int bytesRead = 0;
		
		while(bytesRead>=0){ // erst abbrechen wenn -1 bytes gelesen wurden, sprich der Stream zuende ist
			bytesRead = in.read(buffer);
			fos.write(buffer,0,bytesRead);	
		}
		in.close();
		fos.close();

Wenn der bei dir, in deinem jetzigen Code vorher abbricht, dann muss es eine Abbruch-Bedingung geben... Zeig mal deine komplette Schleife ...
 
G

Guest

Gast
Code:
/*File einelsen und ausgeben bis EOF (-1) erreicht wurde*/
					while (true) {
						
						/*Array mit 0 fuellen*/
						java.utils.Arrays.fill(buffer,0);
						
						iResult = br.read(buffer,0,buffer.length);
						if (iResult <= 0) break;
						System.out.println("eingelesene zeichen: "+iResult);
						
						for (int = 0; i < iResult; i++) {
							
							
							System.out.print(bffer[i]);
							
						}
						
						
					}


Hier ist der Fehler, die Funktion br.read(buffer,0,buffer.length) bricht ab sobald ein 0Byte eingelesen wird, obwohl die Datei noch lange nciht fertig gesendet wurde. Die Funktion liest die Daten ein die vom Server gesendet werden, und diese Daten sind die Filedaten.
 
T

tuxedo

Gast
Du willst damit also sagen:

- Der C-Server sendet ein 0-Byte
- Der Java-Client liest -1 Zeichen (iResult == -1) und Zeile 8 deines Codebeispiels greift und bricht die Endlosschleife

?? Ist das so korrekt?

Wenn ja, dann ist der "Fehler" IMHO auf C-Seite zu suchen. Denn die read() Methode liefert erst dann -1 zurück wenn der Stream "beendet", spriuch EOF ist, und nciht wenn ein 0-byte kommt (hab ich ein Dutzend eigener Anwendungen die mit 0bytes umgehen können und nicht anders aussehen als mein Codebeispiel).

- Alex
 
G

Gast

Gast
@alex0801

Ich mach es doch eig. genau wie du, nur hab ich InputStreamReader verwendet (anfangs hatte ich BufferedReader, aber hab dann eh gleich gemerkt das der falsch dafür ist)

Nur habe ich noch nicht die bytes in eine Datei geschrieben, ich lass sie nur auf dem Bildschirm wiedergeben damit ich gleich sehe ob auch überhaupt alles übertragen wird.

Ich versuch jetzt mal deine Methode aber ich bezweifle das diese nicht auch bei null bytes abbricht, hab schon fast alle streams druchprobiert
 
T

tuxedo

Gast
Wie schön dass du nicht auf meine Frage eingegangen bist und meinen letzten Satz augenscheinlich ignoriert hast.

BTW: Der InputStreamReader ist für Binärdaten nicht so geeignet.

Java API Doc hat gesagt.:
An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified java.nio.charset.Charset charset. The charset that it uses may be specified by name or may be given explicitly, or the platform's default charset may be accepted.

- Alex
 
G

Gast

Gast
@alex0801

Ok, kam mir auch etwas komisch vor warum 0Bytes bei Java nicht empfangen werden sollen.

Der C-Server sendet ein 0Byte das stimmt

Nur gibt die Funktion br.read 1 zurück, als eingelesene Zeichen, aber bricht dann ab

Das hier ist die Ausgabe:

eingelesene zeichen: 4
66771029
eingelesene zeichen: 1
255

Dann kommt nichts mehr, auch die Kommunkation funktioniert nicht mehr mit dem Server weil er noch senden will, aber der Client empfängt keine Daten mehr.

Aber ich werde mal den Fehler beim Server suchen
 
G

Gast

Gast
@alex

Sry ich hab deinen Post erst gelesen also ich schon abgeschickt habe. Der post ober mir ist die Antwort darauf, und ich hab ja gesagt ich such jetzt mal bei der Serverseite nach einem Fehler
 
T

tuxedo

Gast
Wenn er nach 5 Zeichen (4+1) abbricht (bytesRead == -1), dann wurde offensichtlich der Stream beendet. Ein Debug-Output am Server sollte da klarheit verschaffen. Lasse dort einfach mitzählen wieviele Zeichen schon in den Siocket geschickt wurden.

- Alex
 

HoaX

Top Contributor
Anonymous hat gesagt.:
Code:
/*File einelsen und ausgeben bis EOF (-1) erreicht wurde*/
...
						if (iResult <= 0) break;
...
					}

wie ihr ja selbst sagt gibt read -1 zurück wenn der stream beendet ist. diese abfrage bricht aber auch bei 0 ab, was durchaus vorkommen kann wenn die daten schneller empfangen als gesendet werden. mach ein
Code:
iResult != -1
draus, wie es sich gehört.

ebenso an alex,
Code:
>=0
ist falsch, weil was ist bei -2? in diesem context ist das noch "egal", aber ich kenne es z.B. von String#hashCode. dort wird 0 zurückgegeben wenn der string länge 0 hat. der kollege hatte die abfrage >0 gemacht. wir haben fast ewig gesucht bis wir darauf gekommen sind dass der wert bei manches strings negativ ist.

langer rede kurzer sinn: wenn in der doc steht dass das ende des stream -1 ist, dann auch darauf prüfen, und nur darauf!
 
T

tuxedo

Gast
Naja, >=0 sollte ebenso funktionieren. Ist zwar nicht hübsch, aber hat funktioniert. Und wenn man in den Source schaut, dann weiß man auch warum ;-)

Sollte ja auch keine Musterlösung sein, lediglich ein "so haut's zumindest mal hin".

Das <= 0 hab ich doch tatsächlich im Eifer des Gefechts übersehen. Klar, so kanns nicht klappen.

- Alex
 

HoaX

Top Contributor
darum sagte ich ja dass es in diesem context egal ist, sondern so als anregung allgemein
 
T

tuxedo

Gast
Oh man, Zeit für den Feierabend... Schon wieder "überlesen"...

- Alex
 
G

Gast

Gast
Hallo !

Bin erst jetzt nach Hause gekommen desewgen konnte ich nicht mehr Antworten.

Ich hab das Problem jetzt endlich gefunden, dank einem Tipp von alex0801 :)

Und auch danke an dich Hoax, die falsche Bedingung hab ich übersehen.

Schönen Abend noch !!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
Q Datein von Windows nach Mac senden Netzwerkprogrammierung 4
R SFTP auf AIX um Datein auszuwerten Netzwerkprogrammierung 7
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
T E-Mail versenden. Netzwerkprogrammierung 8
L Versenden von "Bildschirm" Netzwerkprogrammierung 2
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
L Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException Netzwerkprogrammierung 10
precoc String Array versenden Netzwerkprogrammierung 7
B Viele verschiedene E-Mails an unterschiedliche Empfänger schnell versenden? Netzwerkprogrammierung 8
S Email via Googlemail versenden Netzwerkprogrammierung 17
M Mail über Exchange versenden Netzwerkprogrammierung 13
P Dateiennamen versenden Netzwerkprogrammierung 4
P Mit Java Javascript-Anfrage versenden Netzwerkprogrammierung 4
T Objekte im NIO unblocking mode versenden Netzwerkprogrammierung 11
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
C An WebDAV einen "MKCOL" Befehl versenden Netzwerkprogrammierung 4
X Versenden von Objekten braucht zu lange Netzwerkprogrammierung 5
N Technologie zum versenden von Objects Netzwerkprogrammierung 5
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
N E-mail versenden Netzwerkprogrammierung 4
B Wie HTTP GET/POST Anfrage versenden? Netzwerkprogrammierung 7
T SWT Image versenden Netzwerkprogrammierung 2
T Einzelne Bits per Socket versenden Netzwerkprogrammierung 16
F Link erzeugen und versenden Netzwerkprogrammierung 4
O Wert versenden? Netzwerkprogrammierung 12
S Objekt Felder versenden Netzwerkprogrammierung 5
A Konflikt: Blocking und Non-Blocking bei Objekte versenden Netzwerkprogrammierung 4
O Über Socket Array versenden Netzwerkprogrammierung 5
G Bytes versenden Netzwerkprogrammierung 9
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
B Strings versenden | Nur 1 Client Netzwerkprogrammierung 6
P Objekte über DatagramSocket versenden Netzwerkprogrammierung 12
V Kann keine DatagramPackets versenden von einem Jar Archiv Netzwerkprogrammierung 4
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
S Dateien versenden Netzwerkprogrammierung 16
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
F IP "versenden" Netzwerkprogrammierung 6
N *.* Dateien versenden im Lan Netzwerkprogrammierung 5
H Versenden von Objekt Netzwerkprogrammierung 2
L JavaMail: Versenden von mails funktioniert nicht Netzwerkprogrammierung 7
P Array per Socketverbindung versenden Netzwerkprogrammierung 2
O Sms versenden Netzwerkprogrammierung 5
T Dateien wia P2P Connection versenden Netzwerkprogrammierung 2
S E-Mails versenden. Netzwerkprogrammierung 10
D Bits über UDP versenden Netzwerkprogrammierung 3
M generelle Frage zum Versenden Netzwerkprogrammierung 4
T Mit JavaMail API Faxe versenden? Netzwerkprogrammierung 5
K Files versenden Netzwerkprogrammierung 5
JavaDevOp Socket Status von UDP-Port prüfen (PortUnreachableException funktioniert nicht?) Netzwerkprogrammierung 32
B Multicast-Nachrichten-Empfang funktioniert nicht Netzwerkprogrammierung 5
S BufferedStream funktioniert nicht immer Netzwerkprogrammierung 7
G UDP Packet empfangen funktioniert nicht. Netzwerkprogrammierung 16
Dann07 Proxy funktioniert nicht so wie gewünscht! Netzwerkprogrammierung 18
M Textchat Funktioniert nur halb Netzwerkprogrammierung 2
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
N Test Servlet funktioniert nicht Netzwerkprogrammierung 11
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
KingSquizzi3 Website parsen mit Hilfe von jsoup funktioniert nicht Netzwerkprogrammierung 3
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
L IText mit Servlets, funktioniert nicht Netzwerkprogrammierung 0
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
C Portscanner funktioniert nicht! Netzwerkprogrammierung 8
K Chatprogramm - Server funktioniert nicht Netzwerkprogrammierung 5
G FTP FTP-Client funktioniert nicht bei Modem-Verbindungen Netzwerkprogrammierung 8
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
M HTTP File Upload mit Prozessbar Funktioniert nicht. Netzwerkprogrammierung 8
J FTP FTP funktioniert nicht. Netzwerkprogrammierung 5
R Client funktioniert nicht Netzwerkprogrammierung 2
M while-Schleife funktioniert nicht bei Nachrichtempfang von Server Netzwerkprogrammierung 3
L Socket Chat funktioniert nicht Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
S RMI Methodenaufruf funktioniert nur lokal Netzwerkprogrammierung 11
C Java Chat funktioniert nicht richtig Netzwerkprogrammierung 6
V Quelltaxt einer Website auslesen funktioniert nicht Netzwerkprogrammierung 2
A RMI RMI Methodenaufruf funktioniert nur spontan Netzwerkprogrammierung 5
S RMI RMI-Applet kommunikation funktioniert nicht Netzwerkprogrammierung 8
D FTP Pfadangabe für ftp-upload funktioniert nicht Netzwerkprogrammierung 5
A Socket UnknownHostException funktioniert nicht! Netzwerkprogrammierung 3
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
M chat funktioniert nicht (Connection refused: connect) Netzwerkprogrammierung 3
R Java-Chat-Applet funktioniert nur in Eclipse Netzwerkprogrammierung 3
T RMI - Client Zugriff auf Server funktioniert nicht Netzwerkprogrammierung 5
M RMI, cast funktioniert nich Netzwerkprogrammierung 2
P Bilder: FTP-Upload funktioniert nicht richtig Netzwerkprogrammierung 2
W RMI funktioniert nur wenn ich im selben Eclipse Projekt bin Netzwerkprogrammierung 3
S OutputStreamWriter funktioniert nicht wie ich will Netzwerkprogrammierung 2
M serialisierung funktioniert nur nach neuer instanzierung Netzwerkprogrammierung 3
G Google-Suche funktioniert nicht Netzwerkprogrammierung 6
S Server - Telnet funktioniert, Server - Client nicht Netzwerkprogrammierung 3
F SimpleFTP funktioniert nicht Netzwerkprogrammierung 6
N UDP zwischen Java und C++ funktioniert nicht. Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben