# Datei senden und empfangen



## Fritz (21. Jun 2006)

Hallo zusammen,

ich möchte eine Datei senden und auf einem anderen PC wieder empfangen.

Code zum Senden:

---

```
import java.io.*;
  import java.net.*;

  public class TCPsend extends Thread {

    int port;
    InetAddress address;
    String file;

   public TCPsend(int port, String file, InetAddress address){
     this.port = port;
     this.file = file;
     this.address = address;
   }

  public void run(){
    File sendFile = new File(Klasse.getSharedDir() + file);
    // Verzeichnis + Datei ermitteln, klappt auch

    try{

        FileInputStream fileStream = new FileInputStream(sendFile);

        byte[] file = new byte[1000000];

        Socket server = new Socket(address, port);

        server.setSoLinger(true,1);
        server.setTcpNoDelay(false);

        server.setSendBufferSize(3932);

        BufferedOutputStream out = new BufferedOutputStream(server.getOutputStream());

        while(fileStream.available() > 0){
          if(fileStream.available() >= file.length){
             fileStream.read(file,0,file.length);
          } else{
            file = new byte[fileStream.available()];
            fileStream.read(file,0,file.length);
          }
        out.write(file,0,file.length);
        out.flush();
       }

    fileStream.close();
    out.close();
    server.close();

    } catch (IOException e) {
        System.err.println(e);
    }
  }
}
```
---

Code zum Empfangen:

---


```
import java.net.*;
import java.io.*;

public class TCP extends Thread {

  ServerSocket tcpSocket;
  File saveFile;

  TCP(ServerSocket tcpSocket, File saveFile){
     this.tcpSocket = tcpSocket;
     this.saveFile = saveFile;
  }

public void run(){
  try{

      byte[] fileStream = new byte[1000000];

      FileOutputStream fileOutput = new FileOutputStream(saveFile);

      tcpSocket.setReceiveBufferSize(4380);

      Socket client = tcpSocket.accept();
      client.setTcpNoDelay(false);
      client.setReceiveBufferSize(4380);

      BufferedInputStream input = new BufferedInputStream(client.getInputStream());

      while(input.read(fileStream,0,1) != -1){
      fileOutput.write(fileStream,0,1);
      fileOutput.write(fileStream,0,input.read(fileStream));
    }

     input.close();
     fileOutput.close();
     client.close();
     tcpSocket.close();

  } catch(IOException e){
       e.printStackTrace();
  }
 }
}
```
---

Der Code ist nur ein Auszug aus einem größeren Projekt.

Problem: Es wird eine Datei gesendet und auch die Datei empfangen - allerdings hat die empfangene Datei immer 0 Byte und ist leer. Woran liegt das?

Danke und Gruß
Fritz


----------



## meez (21. Jun 2006)

Di Datei hat 0 byte, weil nichts empfangen wird...die 0 byte kommen vom FileOutputStream...

Habs mal korrigiert...
btw. Wenn du dir nicht 100% sicher bist, ändere keine BufferSizes o.ä.. Die Defaulteinstellungen sind gut genug...




			
				Fritz hat gesagt.:
			
		

> Code zum Senden:
> 
> ---
> 
> ...


----------



## Fritz (21. Jun 2006)

Hallo meez,

was genau hast Du geändert? Finde beim FileOutputStream (Empfangen) nix neues.

Gruß
Fritz


----------



## meez (22. Jun 2006)

Steht ja da  :!:  .. Mehr als die Methoden zu ändern, kann ich nicht machen...


----------



## Murray (22. Jun 2006)

Das Problem lag bereits auf der Send-Seite - available gibt eben nicht an, wieviele Bytes ingesamt noch gelsen werden müssen, bis die Datei zuende ist, sondern lediglich wieviele Bytes in diesem Moment gelesen werden können, ohne das die Methode blockiert (also darauf warten muss, bis wieder Daten vom Filesystem in den Input-Buffer glesen worde sind).


----------

