# Mehrere Dateien über Socket senden



## ELiTeOne (1. Februar 2008)

Hallo.
Ich sitze grade an einem Programm mit dem ich mehrere dateien über einen Socket versenden kann. 
Bei kleinen dateien funktioniert der Ansatzt sehr gut nur wenn die Dateien größer werde wird der Lesevorgang vorzeitig abgebrochen.

Server:


```
try
     {
      this.fi = new FileInputStream(pfad.replaceFirst(" ",""));  

      this.writer.write(this.FormatString("FILE "+n));
      this.writer.newLine();
      this.writer.flush();
      
      OutputStream o = this.mySocket.getOutputStream();
      byte[] buff = new byte[16000];
      int read;    

      while((read=fi.read(buff,1,buff.length-1))>0)
      {

       buff[0] = 1;
       o.write(buff,0,read+1);
       o.flush();
      
      }

      
      buff[0] = 0;
      o.write(buff,0,1);
      o.flush();
     
     }catch(Exception x)
     {
       System.out.println(x);
     }
```

Client:


```
try
     {
      File f = new File("C:\\Downloads\\");
      f.mkdirs();
      fo = new FileOutputStream("C:\\Downloads\\"+second);
      InputStream in = this.myClient.mySocket.getInputStream();

      byte[] buff = new byte[16000];
      int read=0;
      boolean lauff = true;

      while(lauff)
      {
         read = in.read(buff);

         if(buff[0] == 1)
         {

           System.out.println(buff[0]);
           fo.write(buff,1,(read-1));

         }else{

           System.out.println("buff[0]: "+(int)buff[0]);
           lauff=false;

         }


      }


      System.out.println("Ende While");
      fo.close();
    
     }catch(Exception x)
     {
      System.out.println("Fehler beim Dateidownload!: "+x);
     }
```

Ich kann nicht nachvollziehen warum das so nicht funktioniert aber vielleicht könnt ihr da weiterhelfen.

JavaJoe


----------



## bemar (1. Februar 2008)

Kann es sein, das es genau dann nicht funktioniert, wenn die Datei größer als 16000 byte ist?

Im Server (und im Client auch) kann ich nicht erkennen, das du deinen Offset weitersetzt. Der ist immer bei 1 bzw. 0 im Befehl "fi.read".

Siehe auch http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileInputStream.html#read(byte[],%20int,%20int)


----------



## ELiTeOne (2. Februar 2008)

Ich verstehe nicht ganz warum ich den offset verändern sollte.
Der muss doch immer, zumindest beim server, bei 1 sein, weil buff[0] mit 1 belegt wird solange gesendet wird.

JavaJoe


----------



## bemar (2. Februar 2008)

In der Zeile 


> while((read=fi.read(buff,1,buff.length-1))>0)



liest du solange aus dem FileReader bis nix mehr kommt. Wenn die Datei kleiner 16000 Byte ist, ist das Abbruchkriterium ja erfüllt. 
Wenn du aber eine Datei hast, die größer als 16000 Byte ist liest du endlos immer wieder von Position 1 bis 16000 der Datei.

Du musst den Offset (Parameter 2) weitersetzen.


> offset+=buff.length



Gruß

Ben


----------



## ELiTeOne (3. Februar 2008)

Ist mit Offset nicht der Index gemeint ab dem in das Bytearray gelesen wird?
Weil sonst würde ja mit buff[0] = 1; immer ein byte der Datei verloren gehen, weshalb auch kleine dateien so nur fehlerhaft verschickt werden könnten.


----------



## bemar (3. Februar 2008)

Richtig. In Java geht ein Index immer bei 0 los.
Und ja, der Offset ist die momentane Position in der Datei.


----------



## ELiTeOne (4. Februar 2008)

Wenn dem so wäre dürfte ich kleinere Dateien (bis 50mb) nicht übertragen können, was jedoch wunderbar funktioniert.


----------



## bemar (4. Februar 2008)

Und das was am Ende rauskommt ist auch identisch mit der Quelle?


----------



## bemar (4. Februar 2008)

Hier meine Programmcode, der eine Datei an den Empfänger *sendet*



> public void openSocketServer() {
> String myHost = "localhost";
> int myPort = 3333;
> try {
> ...


----------



## bemar (4. Februar 2008)

Und der hier *empfängt *das ganze:



> public void createSocket() {
> int myPort = 3333;
> try {
> ServerSocket myServer = new ServerSocket(myPort);
> ...


----------



## ELiTeOne (4. Februar 2008)

Ja die Dateien sind vollkommen inordnung wenn ich die versende.
Danke für den quellcode nur löst der mein problem nicht. Ich kann damit pro Verbindungsaufbau nur eine Datei senden. 
Ich will aber bei ener bestehenden verbindung mehrere Dateien senden.


----------



## ELiTeOne (4. Februar 2008)

Also was mich nur wundert ist die Willkürlichkeit.
Wenn ich das z.B. mit einer 4GB iso teste werden mal 300 mb völlig einwandfrei übertragen und mal nur 10 mb, weil buff[0] dann plötzlich im Clienten nicht 1 ist obwol der Sever buff[0] mit 1 belegt.


----------

