Invio di file tramite socket in Java (2nd edition)
In questo articolo avevo già parlato di come trasferire file tramite socket in Java.
Il problema però è che funziona solo se sia il client che il server stanno sulla stessa macchina.
Questo perchè ho fatto uso di oggetti File che sono solo una rappresentazione di un file o directory sul pc, ma che non sanno nulla circa il lror contenuto.
Se invece server e client devono stare su macchine diverse bisogna cambiare un pò la logica.
In sostanza il client deve leggere e inviare il file byte per byte; il server legge tutti i byte e li salva sul pc.
Non si può quindi usare File.
Questo è il client:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
private final String HOST = "host";
private final int PORT = 9977;
public static void main(String[] args) {
Client c = new Client();
c.sendFile();
}
private void sendFile() {
try {
Socket socket = new Socket(HOST, PORT);
FileInputStream fis = new FileInputStream("path/to/file");
OutputStream out = socket.getOutputStream();
byte[] buf = new byte[1024];
int read;
while ((read = fis.read(buf)) != -1) {
out.write(buf, 0, read);
}
fis.close();
out.close();
socket.close();
} catch (UnknownHostException ex) {
System.out.println(ex.getMessage());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
In pratica usiamo FileInputStream per leggere il contenuto del file, e OutputStream per inviare i byte.