Home / Programmazione / Java / Invio di file tramite socket in Java (2nd edition)
Mattepuffo

Invio di file tramite socket in Java (2nd edition)

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