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 ******");
}
}
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 ******");
}
}