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:
CLASSE ReceiverManagercodice: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) { } } } }
codice del client: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"); } }
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:
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.codice:FileInputStream fis = new FileInputStream(in);
grazie per un eventuale aiuto...

Rispondi quotando