Newsgroup: it.comp.java
Titolo: trasferimento file via socket

Salve a tutti ho un problema, devo implementare uno stupidissimo
trasferimento di file da un client ad un server, ma non riesco a farlo
funzionare e non capisco perchè.
L'errore che mi da nel momento in cui il server esegue la seguente
l'istruzione
FileInputStream fis  = new FileInputStream(in);
è il seguente:
java.io.FileNotfoundException :  \home\alex\workspace\client\bin
\prova.class(impossibile trovare il percorso specificato)
at java.io.FileInputStream.open (Native Method)
at java.io.FileInputStream.<init> (Unknown source)
è come se non riuscisse a trovare il file ma il path è corretto e lo
apre pure correttamente il client.
vi posto il codice, ringrazio chiunque possa aiutarmi a scovare
l'errore e possa darmi una soluzione alternativa
CLIENT
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class client {
  private final String SERVER_HOST = "192.168.1.82";
  private final int SERVER_PORT = 9977;
  public static void main(String[] args) {
      client c = new client();
      try {
    	  File file =new File("/home/alex/workspace/client/bin/
prova.class");
    	  System.out.println(file.getAbsolutePath());
    	  System.out.println(file.length());
    	  c.sendFile(file);
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
  private void sendFile(File file) throws IOException {
      Socket socket = null;
      try {
          socket = new Socket(SERVER_HOST, SERVER_PORT);
      } catch (UnknownHostException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
      ObjectOutputStream oos = new ObjectOutputStream
(socket.getOutputStream());
      oos.reset();
      oos.writeObject(file);
      oos.flush();
      oos.close();
  }
}
SERVER
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
public class ReceiverManager implements Runnable {
  private final String SAVE_DIR = "/home/alex";
  private Socket socket;
  public ReceiverManager(Socket socket) {
      this.socket = socket;
  }
  public void run() {
      try {
          System.out.println("presa in carico nuova connessione da " +
socket);
          // intercetto il file in arrivo
          ObjectInputStream oin = new ObjectInputStream
(socket.getInputStream());
          File inFile = (File) oin.readObject();
          // eseguo un cast dell' oggetto come file
          System.out.println(inFile.getAbsoluteFile());
          System.out.println(inFile.getPath());
          // imposto il nuovo file che dovro' salvare
          // prendendone il nome originale
          File saveFile = new File(SAVE_DIR + "/" + inFile.getName());
          // salvo il file
          save(inFile, saveFile);
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          try {
              socket.close();
          } catch (IOException e) { }
      }
  }
      /**
       * Esegue il salvattaggio
       *
       * @param in
       * @param out
       * @throws IOException
       */
      private void save(File in, File out) throws IOException {
          System.out.println(" --ricezione file " + in.getName());
          System.out.println(" --dimensione file " + in.length());
          // apro uno stream sul file che e' stato inviato
          FileInputStream fis  = new FileInputStream(in);
          // scrivo uno stram per il salvataccio del nuovo file
          FileOutputStream fos = new FileOutputStream(out);
          byte[] buf = new byte[1024];
          int i = 0;
          // riga per riga leggo il file originale per
          // scriverlo nello stram del file destinazione
          while((i=fis.read(buf))!=-1) {
              fos.write(buf, 0, i);
          }
          // chiudo gli strams
          fis.close();
          fos.close();
          System.out.println(" --ricezione completata");
      }
    }
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
  private final int SERVER_PORT = 9977;
  public static void main(String[] args) {
      server s = new server();
      try {
          s.listen();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
  private void listen() throws IOException {
      ServerSocket ss = new ServerSocket(5050);
      System.out.println("Sono sulla " + ss);
      // ciclo infinito per accettare per sempre connessioni
      for (;;) {
          // prendo la connessione in ingresso
          Socket s = ss.accept();
          System.out.println("Conessione da " + s);
          // creo ed eseguo il thread per questa connessione
          // cosi il ciclo continua e rimane in attesa di
          // nuove connessioni
          new ReceiverManager(s).run();
          // faccio respirare un po il ciclo
          try {
              Thread.sleep(100);
          } catch (InterruptedException e) { }
      }
  }
}

 
Quell'eccezione la solleva anche se il path esiste ma il file è 
inaccessibile. Prova a controllare innanzi tutto i permessi e poi 
controlla che non è proprio l'apertura da parte del client a rendere 
inaccessibile il file al server.
Ciao
Giuseooe

Ciao giuseppe, innananzitutto grazie per la risposta, cosa intendi
quando dici "controlla che non è proprio l'apertura da parte del
client a rendere inaccessibile il file al server"? come posso
controllarlo?
Il file ha tutti i permessi rwx quindi non dovrebbe essere questo.

fox82 ha scritto:

Immagino che client e server siano sulla stessa macchina quindi, se il 
client apre il file supponiamo in scrittura e lo stesso tenta di fare il 
server, il sistema potrebbe impedirtelo per evitare di fare pasticci.