Ciao a tutti, stavo provando un pò il funzionamento dei socket in java e seguendo una guida su internet provavo a implementare un piccolo sistema che permetta il trasferimento di un file da un pc ad un altro tramite socket.
La guida da me trovata prevedeva di lavorare in ambiente linux-like, quindi con una precisa forma del path e con l'avvio tramite console...io in questo momento devo capire come funziona invece su windows XP precisamente.
codice server:
CLASS Server:
codice:
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(SERVER_PORT);
      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) { }
      }
  }
}
CLASSE ReceiverManager
codice:
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 = "C:\\";
 
  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());
 
          // eseguo un cast dell' oggetto come file
          File inFile = (File) oin.readObject();
 
          // imposto il nuovo file che dovro' salvare
          // prendendone il nome originale
          File saveFile = new File(SAVE_DIR + inFile.getName());
          System.out.println("Il file sara salvato in: " + saveFile.getPath());
          // 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");
  }
}
codice del client:
CLASS CLIENT
codice:
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.104";
  private final int SERVER_PORT = 9977;
 
  public static void main(String[] args) {
      Client c = new Client();
      try {
          c.sendFile(new File("C:\\spese.txt"));
      } 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();
  }
}

Preciso che il server e il client si trovano su due macchine diverse in una sottorete entrambe con WinXP.
Eseguendo prima il server, e poi il client, il server accetta la connessione però rileva una eccezione nella classe ReceiverManager presisamente nella funzione save a questa riga:
codice:
FileInputStream fis  = new FileInputStream(in);
mi dice che non trova il file...se invece nella macchina con sopra il server vado a creare il file spesa.txt in C:\ a quel punto va tutto a buon fine...anche se il file continua a essere vuoto...infatti come dimensione del file mi ritorna 0.
grazie per un eventuale aiuto...