Mehrere Dateien über Socket senden

ELiTeOne

Grünschnabel
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:

Code:
     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:

Code:
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
 
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
 
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
 
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.
 
Wenn dem so wäre dürfte ich kleinere Dateien (bis 50mb) nicht übertragen können, was jedoch wunderbar funktioniert.
 
Hier meine Programmcode, der eine Datei an den Empfänger sendet

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

Socket s = new Socket(myHost, myPort);
System.out.println("Verbindung zu " + myHost + ":" + myPort + " aufgebaut.");
BufferedOutputStream out = new BufferedOutputStream(s.getOutputStream());
File file = new File("//c:/sender.rar");
BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file));

byte[] buffer=new byte[1024];
int numRead;
while( (numRead = fileIn.read(buffer)) >=0)
{
out.write(buffer, 0, numRead);
}
out.close();
} catch (ConnectException e) {
System.out.print(".");
} catch (Exception e) {
e.printStackTrace();
}
}
 
Und der hier empfängt das ganze:

public void createSocket() {
int myPort = 3333;
try {
ServerSocket myServer = new ServerSocket(myPort);
int readMe;
System.out.println("Warte auf eingehende Verbindung auf Port " + myPort + " ....");
//System.out.println("Warte auf eingehende Verbindung ....");
Socket mySocket = myServer.accept();
System.out.println("Eingehende Verbindung aufgebaut. Bereit zum Empfang.");
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream());
File filedest = new File("//c:/received.rar");
BufferedOutputStream fileout = new BufferedOutputStream(new FileOutputStream(filedest));
System.out.println("BufferedReader initialisiert.");
byte[] buffer = new byte[1024];

while ((readMe = in.read(buffer)) >= 0) {
fileout.write(buffer, 0, readMe);
//System.out.println("reading");
}
fileout.close();
in.close();
} catch (SocketException e) {
e.printStackTrace();
//System.out.println("Verbindung zurückgesetzt.");
System.out.println("Verbindung wurde vom Chatpartner zurückgesetzt.");
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
 

Neue Beiträge

Zurück