come posso inviare un file tramite socket?
il mio file è di tipo xml.
Buona anche una guida.
Grazie ciao![]()
![]()
come posso inviare un file tramite socket?
il mio file è di tipo xml.
Buona anche una guida.
Grazie ciao![]()
![]()
/*no comment*/
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):
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.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();
Metodo 2 (chi invia):
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.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();
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
Grazie era proprio quello che cercavo! però potresti postarmi anche il codice del server(metodo2)?
Metodo 2 (chi invia):
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.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();
Ciao.![]()
Scusa ancora il disturbo!![]()
![]()
/*no comment*/
Il codice del server è il più semplice:
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.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();
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
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
![]()
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
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