# File Transfer



## Njoerd (5. Aug 2006)

Hallo also ich hab da ein problem bezüglich file transfer zwischen client und server.
Meine verbindung steht, aber wie sende ich jetz am besten datein zwsichen client und server?

hab folgendes ausprobiert:
	
	
	
	





```
import java.io.*;
import java.net.*;
 
public class PutGet {
    private int port = 4321;
 
    public void get(String strCarrier) throws IOException{
	Socket socket = new Socket(InetAddress.getLocalHost(), port);
	InputStream is = socket.getInputStream();
	FileOutputStream fos=new FileOutputStream(strCarrier);
	byte[] buffer=new byte[1024];
	int cnt;
	while ((cnt=is.read(buffer))!=-1){
	    fos.write(buffer, 0, cnt);
	}
	System.err.println();
	fos.close();
    }
 
    public void put(String strCarrier) throws IOException{
	try {
	    ServerSocket serversocket = new ServerSocket(port);
	    System.out.println("accepting connections to port " + port);
	    Socket socket = serversocket.accept();
	    File fileSend = new File(strCarrier);
	    OutputStream os=socket.getOutputStream();
	    FileInputStream fis=new FileInputStream(fileSend);
	    byte[] buffer=new byte[1024];
	    int cnt;
	    while ((cnt=fis.read(buffer))!=-1){
		os.write(buffer, 0, cnt);
	    }
	    System.err.println();
	    fis.close();
	    socket.close();
	} catch(Exception e){
	    e.printStackTrace();
	}
    }
    public static void main (String[] args) {
	try {
	    if (args != null && args.length > 1 && args[1] != null && args[0].equals("put")) {
		new PutGet().put(args[1]);
	    } else if (args[0].equals("get")) {
		new PutGet().get(args[1]);
	    } else {
		System.err.println("[put|get] filename");
		System.exit(-1);
	    }
	    System.exit(0);
	} catch (IOException e) {
	    e.printStackTrace();
	    System.exit(-1);
	}
    }    
}
```

Am server terminiert mein stream auch(also beim senden) aber leider nicht beim empfangen.
Mir irgendwie auch verständlich, da er ja niemals "-1" empfangen kann und die while schleife somit nicht ausläuft.

Gibts dazu eine löscung oder hat jemand einen anderen vorschlag?
lg + danke für die hilfe


----------



## Guest (7. Aug 2006)

Hallo,

ich weiß zwar nicht, wie du dein Problem lösen kannst, aber mich würde auch interessieren, wie man eine Datei an einen Server schickt :wink:


----------



## Pumpkin (7. Aug 2006)

Der Beitrag gerade stammt von mir, ich war nur nicht eingeloggt :roll:


----------



## Njoerd (8. Aug 2006)

Habe meine eigerne Lösung gefunden, falls sie mal wer braucht, ich poste sie hier

```
//s_in=DataInputStream
//s_out=DataOutputStream
 private boolean recieveFile(File filename) throws Exception{
        try{
        this.s_out.flush();
        long size=0;
        size=s_in.readLong();
        long comp_size=s_in.readLong();
        //filesize wird 2 mal übertragen um zu kontrollieren ob das richtige angekommen ist

        if(size!=comp_size)
            return false;
        //file öffnen
        System.out.println("Filesize: "+size);
        if(filename.exists())
            filename.delete();
        FileOutputStream fos=new FileOutputStream(filename);
        //file empfangen
        byte[] buffer=new byte[1024];
        int cnt=0;
        int sum=0;        
        while (sum<size){
           //falls die ist größe größer ist als die soll gr. abrruch
           if(cnt>=size)
               return false;
           cnt=is.read(buffer);
           fos.write(buffer, 0, cnt);
           sum+=cnt;
           System.out.println(sum+":"+size);
       }
       }catch(Exception e){System.out.println(e.toString());}
        return true;
    }
    
 public void sendFile(String file) throws Exception{
        File fileName=new File(file);
        long size=fileName.length();
        DataOutputStream dos=new DataOutputStream(os);
        dos.writeLong(size);
        dos.flush();
        dos.writeLong(size);
        dos.flush();
        System.out.println(size);
        //File öffnen
        FileInputStream fis=new FileInputStream(file);
        //file senden
        
        byte[] buffer=new byte[1024];
        int cnt=0;
        int sum=0;
        while ((cnt=fis.read(buffer))!=-1){
          os.write(buffer, 0, cnt);
          os.flush();
          sum+=cnt;
          //System.out.println(sum);
       }
       os.flush();
       fis.close();
        
    }
```

es wird so lange empfangen bis filesize erreicht, dann terminiert die while schleife


----------



## Pumpkin (8. Aug 2006)

Wo wird denn beim Senden der Empfänger angegeben?


----------



## njoerd (9. Aug 2006)

sind ja "nur 2 funktionen"
ganz normal über socket

```
Socket s=new Socket(server,port);
...
```


----------

