PDA

View Full Version : [JAVA] Trasferimento file


v1sc3rr4k
11-04-2012, 18:06
Salve a tutti,

ho fatto questa esercitazione che mi diceva di implementare un servizio SFTP con i comandi DIR, GET e PUT. In localhost funziona tutto, ho trasferito anche un film, ma tra due computer nella stessa rete non funziona per niente si blocca dopo l'invio!

SERVER
package Server;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;

public class Server
{
public static void main(String args[]) throws IOException
{
String directory = "C:/Users/Gnegnegne/Documents/Università/Reti di calcolatori/workspace/Sftp2/src/Server";
ServerSocket server = new ServerSocket(1500);

File f = new File(directory + "/FileServer");

if(f.mkdir())
System.out.println("Creata nuovo spazio per file condivisi!" + '\n' + f.getPath());
else
System.out.println("Cartella file già esistente!");



while(true)
new ServerHandler(server.accept() , f.getPath());
}
}


SERVERHANDLER

package Server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;



public class ServerHandler extends Thread
{
public ServerHandler( Socket client , String directory)
{
this.client = client;
this.directory = directory;
start();
}

public void run()
{
try
{
DataInputStream inClient = new DataInputStream(this.client.getInputStream());
DataOutputStream outClient = new DataOutputStream(this.client.getOutputStream());
String sentence;

while(true)
{
sentence = inClient.readUTF();
String temp = sentence.substring(0, 3);

if(temp.equalsIgnoreCase("DIR"))
{
String[] files = new File(directory).list();
outClient.writeInt(files.length);

for(int i = 0 ; i < files.length ; i++)
outClient.writeUTF(files);

outClient.writeUTF(directory);
}

else if(temp.equalsIgnoreCase("PUT"))
{
ObjectInputStream oif = new ObjectInputStream(this.client.getInputStream());

[I]File inFile = (File) oif.readObject();
// Qui ho il problema, mi dice FileNotFound

FileInputStream fis = new FileInputStream(inFile);
FileOutputStream fos = new FileOutputStream(this.directory + "/" + inFile.getName());

byte[] buf = new byte[1024];
int i = 0;

while((i=fis.read(buf))!=-1)
fos.write(buf, 0, i);


System.out.println(" ** ricezione completata **");
}
else if(temp.equalsIgnoreCase("GET"))
{
File f = new File( this.directory + "/" + sentence.substring(4));

if(f.exists())
{
outClient.writeUTF("FOUND");

ObjectOutputStream oof = new ObjectOutputStream(this.client.getOutputStream());
oof.writeObject(f);

System.out.println("Inviato il file: " + f.getName() + '\n' + "Client: " + this.client.toString());
}
else
{
System.out.println("Errore file non trovato!");
outClient.writeUTF("ERROR");
}
}

else if (temp.equalsIgnoreCase("QUI"))
break;



else
System.out.println("Comando non valido!");
}


System.out.println("*** CONNESSIONE CHIUSA ***");

}
catch(Exception e)
{
e.printStackTrace();
}
}

private Socket client;
private String directory;
}


CLIENT

package Client;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JFileChooser;


public class Client
{
public static void main(String args[]) throws IOException, ClassNotFoundException
{
String directory = "C:/Users/Gnegnegne/Documents/Università/Reti di calcolatori/workspace/Sftp2/src/Client/FileClient";
String sentence;
File f;
Scanner s = new Scanner(System.in);

System.out.print("Inserisci un nome client valido: ");

do
{
sentence = s.nextLine();

if( ! (f = new File(directory + "/" + sentence)).mkdir() )
if(f.exists())
{
System.out.println("Bentornato nella tua cartella!");
break;
}
else
System.out.print("Nome non valido reinserisci: ");
else
{
System.out.println("Directory client creata correttamente!");
break;
}
}
while(true);



System.out.println();
System.out.println("****** SFTP ******");
System.out.println();

Socket client = new Socket("localhost" , 1500);
DataInputStream inServer = new DataInputStream(client.getInputStream());
DataOutputStream outServer = new DataOutputStream(client.getOutputStream());

while(true)
{

System.out.println();
System.out.print(">> ");
sentence = s.nextLine();
String temp = sentence.substring(0 , 3);

if(temp.equals("DIR"))
{
outServer.writeUTF(sentence);

int n = inServer.readInt();

for(int i = 1 ; i <= n ; i++)
System.out.println(i + ") " + inServer.readUTF());

System.out.println("Directory: " + inServer.readUTF());
}

else if(temp.equals("PUT"))
{
if(f.list().length !=0)
{
File outFile = null;
JFileChooser choose = new JFileChooser();
int n = choose.showOpenDialog(null);
if( n == JFileChooser.APPROVE_OPTION)
outFile = choose.getSelectedFile();

outServer.writeUTF("PUT " + outFile.getName());


if(outFile.exists())
{
ObjectOutputStream oof = new ObjectOutputStream(client.getOutputStream());
oof.writeObject(outFile);
}
else
System.out.println("Il file che vuoi caricare non esiste!");
}
else
System.out.println("Non puoi caricare dei file, la tua cartella è vuota!");
}

else if(temp.equals("GET"))
{
outServer.writeUTF(sentence);

sentence = inServer.readUTF();

if(sentence.equalsIgnoreCase("FOUND"))
{
ObjectInputStream oif = new ObjectInputStream(client.getInputStream());

File inFile = (File) oif.readObject();

FileInputStream fis = new FileInputStream(inFile);
FileOutputStream fos = new FileOutputStream(f.getPath() + "/" + inFile.getName());

byte[] buf = new byte[1024];
int i = 0;

while((i=fis.read(buf))!=-1)
fos.write(buf, 0, i);

}
else if(sentence.equalsIgnoreCase("ERROR"))
System.out.println("Il file cercato non esiste!");
else
System.out.println("Tu hai detto una stronzata e il server nun è capit nu cazz!");

System.out.println(" [[ ricezione completata ]]");
}

else if(temp.equals("QUI"))
{

outServer.writeUTF(sentence);
break;
}

else
System.out.println("Comando non valido!");


}

System.out.println();
System.out.print("****** CHIUSURA SFTP ******");
}
}

sbeng
12-04-2012, 10:42
Ciao,
non ho ben capito. Nel caso dell'errore il client trasferisce al server o riceve il file dal server?
Prova ad aprirti un client ssh e a connetterti al tuo server, vedi se riesci a trasmettere il file (o a riceverlo).

v1sc3rr4k
12-04-2012, 12:56
Ok ok ho capito il problema leggendo un po' in giro, ho trovato tutti con questa soluzione:

Lato Ricezione


InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File(path));
byte[] buf = new byte[1024];
int read;
while ((read = is.read(buf)) != -1)
fos.write(buf, 0, read);


Lato Invio


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);


La cosa che non capisco è, ma qual'è la condizione di uscita per il ricevente. Perchè quello che manda trova read = -1 ed esce, e chi riceve???