Dateien versenden

Status
Nicht offen für weitere Antworten.
S

Stiewen

Gast
Aloa he!

Ich habe ein Problem mit der Dateiversendung in einem lokalen Netzwerk!

Hier mein Source bisher:

Sender:
Code:
  public void run (  ) {
    try {
      FileInputStream fisIn = new FileInputStream(strFile);
      OutputStream osOut = soClient.getOutputStream();
      File fi = new File(strFile);
      int intTemp;
      longFileSizeLeft = fi.length();
      longMaxBuffer = Long.parseLong(strFileLength);
      byte[] b = getBuffer();
      while ( fisIn.read(b) != 0 ) {
        osOut.write(b);
        osOut.flush();

        // BufferSize von der Restgroesse der Data abziehen
        longFileSizeLeft -= b.length;

        // neuen Buffer anlegen
        b = getBuffer();
        
        jpbTransfered.setValue(intProcess++);
        jlbInfo.setText("Transfered: " + (intProcess / 1024) + " kB/ " + (Integer.parseInt(strFileLength) / 1024) + " kB");
      }
      fisIn.close();
      jbuStatus.setText("Sender OK");
    } catch ( IOException ioe ) {

    }
  }

  public byte[] getBuffer (  ) {
    if ( longFileSizeLeft >= longMaxBuffer ) {
      return new byte[(int)longMaxBuffer];
    } else {
      return new byte[(int)longFileSizeLeft];
    }
  }
Server:
Code:
public void run (  ) {
    try {
      InputStream isIn = soClient.getInputStream();
      OutputStream osOut = new FileOutputStream(database.strHomeDir + strFile);
      longFileSizeLeft = Long.parseLong(strFileLength);
      longMaxBuffer = Long.parseLong(strFileLength);
      int intTemp;
      byte[] b = getBuffer();
      while ( isIn.read(b) != 0 ) {
        osOut.write( b );
        osOut.flush();

        // BufferSize von der Restgroesse der Data abziehen
        longFileSizeLeft -= b.length;

        // neuen Buffer anlegen
        b = getBuffer();
        
        jpbTransfered.setValue(b.length);
        jlbInfo.setText("Transfered: " + (b.length / 1024) + " kB/ " + (Integer.parseInt(strFileLength) / 1024) + " kB");
      }
      osOut.close();
      jbuStatus.setText("Server OK");
    } catch ( IOException ioe ) {

    }
  }

  public byte[] getBuffer (  ) {
    if ( longFileSizeLeft >= longMaxBuffer ) {
      return new byte[(int)longMaxBuffer];
    } else {
      return new byte[(int)longFileSizeLeft];
    }
  }

Prob: ich bekomm, wenn ich zB. ein Bild sende immer nur einen Teil von dem Bild perfekt an und den Rest mit anderen Farben oder gar nicht...

Sollte ich bei dieser Übertragung bleiben oder auf DatagrammSockets über gehen, von denen ich noch keinen blassen Dunst habe und somit um ein kleines Beispiel bitten würde, wenn dies notwendig ist.

Danke, Stiewen
 
B

Beni

Gast
Ein InputStream füllt nicht immer den gesammten byte[] Buffer auf, den man ihm übergibt, er sagt aber wieviel bytes er tatsächlich geschrieben hat. Write hat ein ganz ähnliches verhalten, und schreibt nicht immer alles... das würde ich abfangen und beim schreiben auf die Festplatte berücksichtigen.
 

Bleiglanz

Gesperrter Benutzer
falsche Abbruchbedingung?

=> vergleich mit -1 bei read!!!!

du hörst auf, wenn das erste mal 0 kommt; und das kann durchaus mal passieren wenn gerade nichts da ist...
 
S

Stiewen

Gast
Gut gut...
Also:
@Bleiglanz: ich weiß, dass man es mit -1 macht, aber komischer Weise hängt er sich bei mir dann immer auf... heißt: er scheint unendlich daten zu schicken... *ANNOYED*

@Beni: Wie sollte ich was machen? *ANNOYED* ^^
 
B

Beni

Gast
Für den Server könnte das in die Richtung gehen:
Code:
byte[] buffer = new byte[1024];
while( ... ){
  int read = 0;
  // read
  while( read < buffer.length ){
    int delta = fileInput.read( buffer, read, buffer.length - read );
    if( delta == -1 )
      break;
    read += delta;
  }

  // write
  int write = 0;
  while( write < read ){
    int delta = socketOut.write( buffer, write, read - write );
    write += delta;
  }
}
 
S

Stiewen

Gast
geht gut
@Bleiglanz: Kein osOut.cose(), weil ich hörte, und auch bemerkte, dass dadurch auch alle anderen Streams geschlossen werden. Und da ich einen Messanger schreibe, habe ich einen Stream für den Text und für die Dateien ... und wenn ich close mache nach der Übertragung, kann ich keinen text mehr senden :meld: :bae:

@Beni: Ich bekomme bei der write-schleife eine Meldung: in der zeile (b ist mein buffer)
Code:
delta = osOut.write(b, write, read - write);
Meldung:
incompatible types
found: void
required: int

:autsch:
 

Bleiglanz

Gesperrter Benutzer
Kein osOut.cose(), weil ich hörte, und auch bemerkte, dass dadurch auch alle anderen Streams geschlossen werden
versteh ich nicht, warum verwendest du nicht 2 getrennte Sockets für Text und Dateien

mit einem kanns so nicht gehen, da müsstest du dir ja Start- und Stopzeichen selber überlegen (also eine Art Mini-Protokoll)

Wie soll denn bei deinem Schema überhaupt das Ende einer Datei erkannt werden
 
B

Beni

Gast
Stiewen hat gesagt.:
@Beni: Ich bekomme bei der write-schleife eine Meldung: in der zeile (b ist mein buffer)
Code:
delta = osOut.write(b, write, read - write);
Meldung:
incompatible types
found: void
required: int

:autsch:
Oh, da hatte ich was falsch in Erinnerung. Ok, dann gibts eine Schleife weniger und nur ein einfaches "osOut.write", ohne das delta.

Aber beim "read" bleib ich dabei, das muss man gesondert behandeln (und diesmal habe ich in der API nochmal nachgeschaut).
 
S

stiewen

Gast
Also, ich komm net mehr klar!
wie soll ich denn bitte ordentlich bytes verschicken, wenn write nicht ordentlich funzt?
WER HAT DEN DRECK PROGRAMMIERT??????????
:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:
kleiner scherz... :noe:
ICH BIN JAVA-FAN ^^


So, schluss mit lustig: Wie soll ich das denn nun machen, hab am oben genannten source rumgebastelt mit dem überprüfen, dass er ordentlich ordentlich ausliest, habs aber wieder weg genommen, weil der es auch nicht besser war.
ich weiß nicht, wie ich weiter machen soll oder geschweige denn anfangen soll das prob zu beheben ... ich bedanke mich für jede Hilfe, wenn sie nicht so aussieht, dass gesagt wird, dass ich 5 seiten API durchlesen soll oder sowas ...
 

Bleiglanz

Gesperrter Benutzer
also nochmal

wenn du kein close machst, kannst du mir dann bitte mal erklären, wie dein Empfänger das Ende des Sendevorgangs überhaupt jemals erkennen soll???
 
S

stiewen

Gast
Also, ich stürze mich jetzt einfach mal in die Klassen DatagrammSocket und DatagrammPacket rein
Wer dies verhindern möchte, sollte bitte grund und andere lösung bereit stellen ...
@bleiglanz: ich dachte, dass wenn einfach mal kein byte mehr gesendet wird oder der rest des buffers leer ist, ein -1 oder 0 überreicht wird... aber ich versuche das jetzt mit den beiden klassen zu umgehen
 
B

Beni

Gast
DatagrammSocket/Packet ist UDP, da hast du nichtmal eine Garantie, dass überhaupt was beim Client ankommt :wink:
Machs lieber so wie du es jetzt im anderen Thread geschrieben hast. Du kannst ja noch ein paar BufferedInput/OutputStreams drumhängen, damit das schneller geht.
 

Bleiglanz

Gesperrter Benutzer
stiewen hat gesagt.:
Also, ich stürze mich jetzt einfach mal in die Klassen DatagrammSocket und DatagrammPacket rein
Wer dies verhindern möchte, sollte bitte grund und andere lösung bereit stellen ...
@bleiglanz: ich dachte, dass wenn einfach mal kein byte mehr gesendet wird oder der rest des buffers leer ist, ein -1 oder 0 überreicht wird... aber ich versuche das jetzt mit den beiden klassen zu umgehen

An deinem Problem ändert auch UDP nichts (ist übrigens der total falsche Weg, damit kannst du keine Datei übertragen)

"wenn einfach mal kein byte mehr gesendet wird oder der rest des buffers leer", das ist Wunschdenken...was soll das überhaupt heissen dass kein byte mehr gesendet wird...1 Sekunde lang nix? 10 Sekunden lang nix?? 100 Sekunden lang nix???

wie gesagt:

entweder eigenes Protokoll erfinden um das Ende zu erkennen

oder

close()
 
S

stiewen

Gast
KK, ich bleib beim streamen...
@Bleiglanz: ich übergebe im byte einfach ein -1 und fein is... oder geht das auch wieder net?

so, jetzt aber mal was komisches: ich hab mir die bytes eines jpg-Bildes mal einlesen lassen und mir ist was komisches aufgefallen. bei diesem Source:
Code:
      FileInputStream fisIn = new FileInputStream(strFile);
      OutputStream osOut = soClient.getOutputStream();
      byte[] buffer = getBuffer();
      int intRead = 0;
      int intDelta;
      int intTemp = 0;
      while ( intRead < buffer.length ) {
        intDelta = fisIn.read(buffer, intRead, buffer.length - intRead);
        if ( intDelta == -1 )
          break;
        intRead += intDelta;
      }
      while ( intTemp < buffer.length ) {
        System.out.println(buffer[intTemp++] );
      }

und diesen buchstaben aus der datei: (jpg-bild mit editor öffnen)
ÿØÿà JF
...

gibt er das aus:
-1
40

-1
-32
0
16
...
und dann noch ein paar negative zahlen, wie -2 und dann auch noch hier und da eine -1 ... WAS SOLL DAS DENN????
ich habe sie noch nicht mal gesendet und es kommen schon fehler
 
B

Beni

Gast
Hä? Der Editor versucht dein Bild als ASCII-Zeichen zu interpretieren, Java versucht es in signed bytes zu pressen. Die Darstellung ist doch total uninteressant, wichtig ist das Bitmuster, und das ist beidesmal identisch :wink: Problematisch wird es erst, wenn du als signed byte liest, und als ASCII speicherst... wie man das mit den Reader/Writern machen kann.
 

Bleiglanz

Gesperrter Benutzer
@Bleiglanz: ich übergebe im byte einfach ein -1 und fein is... oder geht das auch wieder net?
das ist ja ein Knüller, was ist wenn deine Datei mal zufällig eine -1 enthält

eine 2,3 MB mp3 hat knapp 2300000 Bytes, da könnte doch durchaus mal eine dabei sein
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
N *.* Dateien versenden im Lan Netzwerkprogrammierung 5
T Dateien wia P2P Connection versenden Netzwerkprogrammierung 2
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
T MP3 Dateien Stream Netzwerkprogrammierung 3
I Kleine Dateien senden Netzwerkprogrammierung 3
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
D Aus einer URL die Dateien lesen Netzwerkprogrammierung 5
D HTTP Checksumme von Dateien abfragen Netzwerkprogrammierung 2
Semox HTTP Webserver: Externe Dateien werden nicht verwendet. Netzwerkprogrammierung 10
Weltall 7 HTTP Dateien an PHP-Skript senden Netzwerkprogrammierung 11
M Dateien über TCP/IP senden Netzwerkprogrammierung 18
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
J Mit der File Api Dateien von anderen Rechnern lesen ? Netzwerkprogrammierung 3
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
E Upload großer Dateien? Netzwerkprogrammierung 5
D dateien kopieren, am localhost funktionierts, im netz nicht Netzwerkprogrammierung 2
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
M dateien übertragen, probleme mit versch. Strömen? Netzwerkprogrammierung 4
V Dateien Auflisten Netzwerkprogrammierung 3
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
flashfactor Dateien im Netzwerk kopieren Netzwerkprogrammierung 2
I Dateien schnell/synchron senden Netzwerkprogrammierung 2
S Dateien auf einem HTTP Server Netzwerkprogrammierung 2
O Dateien von einem Server laden Netzwerkprogrammierung 3
W Server schickt Dateien jede 3 Sekonden Netzwerkprogrammierung 3
C Verzeichnisstrukturen & Dateien über Socketverb. übertra Netzwerkprogrammierung 12
A FileSend - Dateien verschicken Netzwerkprogrammierung 19
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
G Datein versenden funktioniert nicht ! Netzwerkprogrammierung 19
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
F IP "versenden" Netzwerkprogrammierung 6
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
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

Ähnliche Java Themen


Oben