Oggi vi propongo una coppia di programmi scritti in Java che ci permette di trasferire i file tra pc via socket attraverso l''architettura client/server. Il funzionamento è molto semplice:
- Connessione tra server e client nella porta predefinita( ex. 9999);
- Il server invia al client i parametri del file che sta per inviare;
- Il client riceve i parametri e si prepara per la ricezione del file;
- Il server invia il file al client.
Vediamo subito i due codici:
SERVER:
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;public class send{ServerSocket ss;Socket s;public send() throws IOException{int port = 9999;String path_file = "C:\\prova.xtx";int dim_file = 481;String nome = "prova.xtx";// mi connetto al clients = connect(port);// invio il filesend_File(path_file,nome,dim_file);}// funzione per connettermi al clientpublic Socket connect(int port){Socket sock = null;try {ss = new ServerSocket(9999);System.out.println("* Attendo un client");sock = ss.accept();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println("* connesso con successo");return sock;}public void invia_parametri(String nome,int dimensione,ObjectOutputStream oos){String param = nome+","+dimensione;try {oos.flush();oos.writeObject(param);} catch (IOException e) {e.printStackTrace();}}public void send_File(String path_file,String nome,int dim_file) throws IOException{System.out.println("* Inizio processo di invio del file");String path = path_file;int dim = dim_file;FileInputStream fis = null;ObjectOutputStream oos;try {fis = new FileInputStream(path);oos = new ObjectOutputStream(s.getOutputStream());byte[] buf = new byte[1024];int read,tot=0;// invio i dati del file al clientinvia_parametri(nome,dim,oos);// inizio fase di letturaSystem.out.println("* Inviati: ");oos.flush();while ((read = fis.read(buf)) != -1 ) {tot += read;System.out.println(" - "+tot+ " byte");oos.write(buf, 0, read);oos.flush();}System.out.println("** File inviato con successo");} catch (FileNotFoundException e) {e.printStackTrace();}}public static void main(String Args[]) throws IOException{new send();}}
CLIENT:
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.net.Socket;import java.net.UnknownHostException;public class get{Socket s;public get() throws IOException{String ip = "127.0.0.1";int port = 9999;String default_dir = "C:\\Users\\CARLO\\Desktop\\";// mi connetto al serverboolean connected = connect(ip,port);if (connected == false){System.out.println("Non esiste alcun server sulla porta " + port);System.exit(0);}// avvio la ricezione del fileget_File(default_dir);}// funzione per connettermi al serverpublic boolean connect(String ip,int port){boolean result = false;try {s = new Socket(ip,port);result = true;System.out.println("* connesso con successo");} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}public String[] ottengo_parametri(ObjectInputStream ois){String parametri_file[] = null;try {String param = (String)ois.readObject();parametri_file = param.split(",");} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return parametri_file;}public void get_File(String dest) throws IOException{System.out.println("* Inizio processo di ricezione");String destinazione = dest;int read,tot = 0;ObjectInputStream ois = new ObjectInputStream(s.getInputStream());String [] param_file = ottengo_parametri(ois);String nome = param_file[0];int dimensione = Integer.parseInt(param_file[1]);// stream per il salvataggio del file su discoFile file = new File(destinazione+nome);// apro outputStreamFileOutputStream fos = new FileOutputStream(file, true);byte[] buf = new byte[1024];System.out.println("* Ricevo: ");// prendo il pacchetto di 1024 kbtry{while ((read = ois.read(buf)) != -1) {tot += read;System.out.println(" - "+tot+ " byte");// scrivo il pacchetto su discofos.write(buf, 0, read);}}catch(java.net.SocketException e){if (tot == dimensione){System.out.println("** File ricevuto con successo");}else{System.out.println("$$ ERRORE - c''è stato qualche problema!");}}}public static void main(String Args[]) throws IOException{new get();}}