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.
Il tutto avviene nel ciclo while: fino a che fis ha byte da leggere out li scrive in uno stream inviato tramite socket.
Per quanto riguarda la parte server dobbiamo modificare la classe MTManager che è quella classe lanciata ad ogni connessione e che si occupa di salvare il file:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class MTManager implements Runnable {
private final String DIR_SAVE = "/media/hd/ftp";
private Socket socket;
public MTManager(Socket socket) {
this.socket = socket;
}
public void run() {
try {
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File(DIR_SAVE + "/booklog.log"), true);
byte[] buf = new byte[1024];
int read;
while ((read = is.read(buf)) != -1) {
fos.write(buf, 0, read);
}
fos.close();
is.close();
socket.close();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
socket.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
In pratica avviene l'esatto contrario del client!
Ringrazio LeleFT del forum HTML.it
java socket multithread file fileinputstream
Commentami!