Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    trasferimento file con socket

    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...
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: trasferimento file con socket

    Originariamente inviato da MrX87
    codice:
              // intercetto il file in arrivo
              ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
     
              // eseguo un cast dell' oggetto come file
              File inFile = (File) oin.readObject();
    Mi spiace ma è sbagliatissimo! Il concetto è che non devi trasferire un java.io.File (che rappresenta solo una "astrazione" di un percorso sul file-system) con l'intenzione di "aprirlo" con una classe di I/O.

    Se client e server sono due macchine distinte, tu nel ricevitore ricevi un java.io.File che rappresenta un path sull'altra macchina e non puoi di certo "leggere" banalmente il file aprendolo con FileInputStream!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Se client e server sono due macchine distinte, tu nel ricevitore ricevi un java.io.File che rappresenta un path sull'altra macchina e non puoi di certo "leggere" banalmente il file aprendolo con FileInputStream!!
    quindi le due istruzioni che hai detto tu sono entrambe sbagliate e di conseguenza anche tutto il codice che viene dopo in quanto si basa proprio sulla apertura del file con FileInputStream!! giusto?

    e come faccio dal server ad intercettare il file e aprirlo sulla makkina client e leggere quello che c'è dentro per copiarlo su un file nella macchina del server?
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da MrX87
    quindi le due istruzioni che hai detto tu sono entrambe sbagliate e di conseguenza anche tutto il codice che viene dopo in quanto si basa proprio sulla apertura del file con FileInputStream!! giusto?
    Sì, tutto sbagliato.

    Originariamente inviato da MrX87
    e come faccio dal server ad intercettare il file e aprirlo sulla makkina client e leggere quello che c'è dentro per copiarlo su un file nella macchina del server?
    Quello che devi fare è inviare sul socket tutto il contenuto del file, byte per byte!

    Quindi il mittente apre il file, legge (preferibilmente a "blocchi" di x byte) e invia i dati sul socket. Il destinatario legge i dati e li scrive su un nuovo file che apre in scrittura.

    Ma nota bene che se devi inviare anche il nome del file (e eventualmente un path parziale) e magari anche poter gestire il trasferimento di più file durante una singola "connessione", devi pensare bene al "protocollo" di comunicazione che vuoi realizzare. In sostanza devi stabilire cosa/come/quando i due host devono inviare e/o aspettarsi man mano che la comunicazione avanza.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    per adesso la mia idea era semplicemente provare a inviare un file di testo .txt dal client al server...sto cambiando un pò di cose...sia dalla parte del client...dove faccio leggere il file a blocchi di bytes e li invio al server...e quindi devo cambiare anche tutta la funzione save() presente lato server...il resto del codice funziona...
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.