Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Inviare un file tramite socket?

    come posso inviare un file tramite socket?
    il mio file è di tipo xml.
    Buona anche una guida.
    Grazie ciao
    /*no comment*/

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Dato che si tratta di un file XML (quindi sostanzialmente un file di testo), hai due possibilità. La prima, specifica per i file di testo, consiste nell'inviare tramite la socket ciascuna riga di testo utilizzando dei semplici oggetti String.
    La seconda, più generale, per qualsiasi tipo di file, consiste nell'inviare tramite socket dei pacchetti di byte dei dati.
    Ecco come.

    Metodo 1 (chi invia):
    codice:
    // Costruisco la socket verso il "server" che riceverà il file
    Socket s = new Socket(ip_destinazione, porta);
    ObjectOutputStream oos = new ObjectOutputStream( s.getOutputStream() );
    
    // Mi preparo per leggere il file da inviare
    BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("miofile.xml") ) );
    
    // Lo invio, riga per riga
    String linea = "";
    while((linea = br.readLine()) != null) {
       oos.writeObject( linea );
       oos.flush();
    }
    
    // Chiudo il file e il canale della socket
    br.close();
    oos.close();
    
    // Chiudo anche la socket, per sicurezza
    s.close();
    Per chi riceve il processo è inverso: attende un collegamento (ServerSocket), apre un canale di input (ObjectInputStream), legge tutti i dati che gli arrivano (le linee), e le scrive su un file attraverso un PrintStream creato precedentemente.

    Metodo 2 (chi invia):
    codice:
    // Costruisco la socket verso il "server" che riceverà il file
    Socket s = new Socket(ip_destinazione, porta);
    ObjectOutputStream oos = new ObjectOutputStream( s.getOutputStream() );
    
    // Mi preparo per leggere il file da inviare (come file binario)
    FileInputStream fis = new FileInputStream("miofile.xml");
    
    // Lo invio, a blocchi di 4 kb al massimo
    byte [] buffer = new byte[4096];
    byte [] bufOut;
    int len = 0;
    while((len = fis.read(buffer)) > 0) {
       if (len < 4096) {
          bufOut = new byte[len];
          for(int i=0; i<len; i++) bufOut[i] = buffer[i];
       } else {
          bufOut = (byte[]) buffer.clone();
       }
       oos.writeObject( bufOut );
       oos.flush();
    }
    
    // Chiudo il file e il canale della socket
    fis.close();
    oos.close();
    
    // Chiudo anche la socket, per sicurezza
    s.close();
    Dall'altra parte, come nel metodo 1, c'è un "server" che ascolta e attende una connessione per poi leggere tutti gli array di byte che gli arrivano e scriverli, questa volta tramite un FileOutputStream, all'interno del file da creare.


    Non garantisco che il codice che ho postato sia esente da errori, dato che l'ho scritto di getto senza provarlo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3

    Metodo 2 (chi invia):
    codice:
    // Costruisco la socket verso il "server" che riceverà il file
    Socket s = new Socket(ip_destinazione, porta);
    ObjectOutputStream oos = new ObjectOutputStream( s.getOutputStream() );
    
    // Mi preparo per leggere il file da inviare (come file binario)
    FileInputStream fis = new FileInputStream("miofile.xml");
    
    // Lo invio, a blocchi di 4 kb al massimo
    byte [] buffer = new byte[4096];
    byte [] bufOut;
    int len = 0;
    while((len = fis.read(buffer)) > 0) {
       if (len < 4096) {
          bufOut = new byte[len];
          for(int i=0; i<len; i++) bufOut[i] = buffer[i];
       } else {
          bufOut = (byte[]) buffer.clone();
       }
       oos.writeObject( bufOut );
       oos.flush();
    }
    
    // Chiudo il file e il canale della socket
    fis.close();
    oos.close();
    
    // Chiudo anche la socket, per sicurezza
    s.close();
    Dall'altra parte, come nel metodo 1, c'è un "server" che ascolta e attende una connessione per poi leggere tutti gli array di byte che gli arrivano e scriverli, questa volta tramite un FileOutputStream, all'interno del file da creare.

    Ciao.
    Grazie era proprio quello che cercavo! però potresti postarmi anche il codice del server(metodo2)?
    Scusa ancora il disturbo!
    /*no comment*/

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Il codice del server è il più semplice:
    codice:
    // Creo una ServerSocket e attendo una connessione
    ServerSocket ss = new ServerSocket( porta );
    Socket client = ss.accept();
    
    // Qui è arrivata la connessione, creo un ObjectInputStream per ricevere i dati
    ObjectInputStream ois = new ObjectInputStream( client.getInputStream() );
    
    // Creo il file di Output
    FileOutputStream fos = new FileOutputStream( "nomeFile" );
    
    // Ora ricevo tutti i pacchetti
    byte buffer[];
    try {
       while ( true ) {
          buffer = (byte[]) ois.readObject();
          fos.write( buffer );
       }
    } catch (Exception eofe) {
       // Qui è terminata la connessione perchè i dati sono finiti. Chiudo il file
       fos.close();
    }
    
    // Chiudo il canale della socket (non è necessario data l'Exception precedente)
    ois.close();
    
    // Chiudo comunque la socket
    client.close();
    Ad ogni modo, io preferisco creare un protocollo di comunicazione che eviti la generazione di eccezioni inutili: è sufficiente creare una classe da trasmettere con un flag multisignificato che indichi la terminazione dei byte di dati e chiudere le socket correttamente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    1
    vorrei sapere se esiste anche un altro modo per trasferire file di qualunque tipo lungo la rete cioè devo per forza creare un arrey di byte e inviare quello lungo la rete o esiste una classe che gli posso passare in input il file da spedire?
    Perche a me quella soluzione da problemi cioè non riesco ad aprire il file che ho ricevuto perche il file è danneggiato pero la dimensione del file è uguale a quella del file sorgente.

    grazie a tutti
    ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5
    Salve ragazzi, desideravo cortesemente un aiuto. Ho letto il codice ed è esattamente quello che serviva anche a me ma non ho capito come creare il codice (lato server) del metodo 1. E' valido quello del metodo 2 anche per questo o considerando che si va a leggere delle stringhe non posso utilizzare un buffer? Attendo un vostro gradito riscontro.

    Saluti

    Alessandro

    03/05/2011

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327

    Moderazione

    Apri una nuova discussione, eventualmente linkando questa.
    Ma, come espressamente indicato nel Regolamento interno, non si risollevano discussioni morte da tempo... specialmente se sono defunte da ormai 5 anni...


    Devo chiudere.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.