Ciao a tutti!!!
Ho un problema paradossale, per fare un programma sto utilizzando parte di codice di un programma che ho fatto l'anno scorso (funzionante) ma il problema è che per "magia" non va più.
Devo inviare semplicemente un file da client a server e viceversa.
Per comodità (più corto e tutto in un file) vi incollo il codice di un programmino fatto dal mio prof, che ho utilizzato l'anno scorso (ho utilizzato le sue classi sendFile e getFile).
PARTE SERVER
codice:
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.io.ObjectOutputStream;
public class MediaServer
{
private static ServerSocket serverSocket;
private static final int PORT = 7777;
public static void main(String[] args)
{
System.out.println(">>> Pronto al servizio <<<\n");
try
{
serverSocket = new ServerSocket(PORT);
}
catch(IOException ioEx)
{
System.out.println(">>> Impossibile agganciare la porta! <<<");
System.exit(1);
}
do
{
try
{
Socket link = serverSocket.accept();
System.out.println("Accepted connection : " + link);
Scanner inStream = new Scanner(link.getInputStream()); // crea un oggetto scanner e lo associa allo stream di input del socket connesso al client
ObjectOutputStream outStream = new ObjectOutputStream(link.getOutputStream()); // crea un oggetto ObjectOutputStream associato all'oggetto Socket
String message = inStream.nextLine(); // acquisisce il messaggio
if (message.equals("IMAGE")) // chiama metodo sendFile a seconda del tipo di file passando nome file e oggetto ObjectOutputStream
sendFile("./DATABASE/immagine.jpg", outStream);
if (message.equals("SOUND"))
sendFile("./DATABASE/canzone.mp3", outStream);
}
catch(IOException ioEx) // cattura eccezioni IO
{
ioEx.printStackTrace();
}
}while (true);
}
private static void sendFile(String fileName, ObjectOutputStream outStream)
throws IOException
{
FileInputStream fileIn = new FileInputStream(fileName); // crea un oggetto FileInputStream passandogli il nome del file nel costruttore
long fileLen = (new File(fileName)).length(); // crea un oggetto File anonimo (non verra' piu' usato dal nome del file e usa metodo length per determinarne la lunghezza
int intFileLen = (int)fileLen; // converte log a int e dichiara un array di byte di questa lunghezza
byte[] byteArray = new byte[intFileLen];
fileIn.read(byteArray); // usa metodo read di FileInputStream per leggere il contenuto del FileInputStream nello array di byte
fileIn.close(); // chiude alla fine
outStream.writeObject(byteArray); // utilizza oggetto ObjectOutputStream per spedire array di byte al client
outStream.flush();
}
}
PARTE CLIENT
codice:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.ObjectOutputStream;
public class MediaClient
{
private static InetAddress host;
private static final int PORT = 7777;
public static void main(String[] args)
{
try
{
host = InetAddress.getLocalHost();
}
catch(UnknownHostException uhEx)
{
System.out.println(">>> Non trovato host ID! <<<");
System.exit(1);
}
try
{
Socket link = new Socket(host,PORT);
// crea oggetti ObjectInputStream e PrintWriter associandoli al socket
ObjectInputStream inStream = new ObjectInputStream(
link.getInputStream());
PrintWriter outStream = new PrintWriter(
link.getOutputStream(),true);
// definisce stream per ingresso da tastiera
Scanner userEntry = new Scanner(System.in);
System.out.print(">>> Richiesta (IMAGE/SOUND): ");
String message = userEntry.nextLine();
while(!message.equals("IMAGE") && !message.equals("SOUND"))
{
System.out.println("\n>>> Riprovaci! <<<\n");
System.out.print(">>> Richiesta (IMAGE/SOUND): ");
message = userEntry.nextLine();
}
// utilizza oggetto PrintWriter per mandare la richiesta al server
outStream.println(message);
// riceve il file
getFile(inStream, message);
link.close();
}
catch(IOException ioEx)
{
ioEx.printStackTrace();
}
catch(ClassNotFoundException cnfEx)
{
cnfEx.printStackTrace();
}
}
private static void getFile(ObjectInputStream inStream, String fileType)
throws IOException, ClassNotFoundException
{
// utilizza metodo readObject di ObjectInputStream per ricevere il file
// dal server facendo un cast di tipo da Object a byte[]
byte[] byteArray = (byte[])inStream.readObject();
// crea oggetto FileOutputStream per ricevere dati
FileOutputStream mediaStream;
// riceve dati a seconda del tipo di file passando il nome del file
if (fileType.equals("IMAGE"))
mediaStream = new FileOutputStream("./DOWNLOAD/image.jpg");
else
mediaStream = new FileOutputStream("./DOWNLOAD/canzone.mp3");
// utilizza metodo write di FileOutputStream per riempire il file
// con array di byte
mediaStream.write(byteArray);
}
}
L'anno scorso funzionava alla perfezione, quest'anno il server mi da quest'errore (esempio SOUND)
codice:
Accepted connection : Socket[addr=/192.168.0.3,port=2360,localport=7778]
java.io.FileNotFoundException: .\DATABASE\canzone.mp3 (Impossibile trovare il percorso specificato)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at MediaServer.sendFile(MediaServer.java:76)
at MediaServer.main(MediaServer.java:57)
non riesco a capire il perchè, ho provato a cambiare i percorsi, a mettere "java.io.File.separator" sono disperato, aiutatemi !!!
Grazie ;-)