Salve ragazzi,
ho un piccolo problema di comunicazione client-server.
Mi sapreste dire dove è il problema??
Server
codice:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class PutFileServerSeq {
// porta al di fuori del range 1-1024!
// dichiarata come statica perche' caratterizza il server
public static final int PORT = 54321;
/**
* Main invocabile con 0 o 1 argomenti. Argomento possibile -> porta su cui
* il server ascolta.
*
*/
public static void main(String[] args) throws IOException {
// Porta sulla quale ascolta il server
int port = -1;
Gui.Inizialize();
/*
* controllo argomenti
*/
try {
if (args.length == 1) {
port = Integer.parseInt(args[0]);
// controllo che la porta sia nel range consentito 1024-65535
if (port < 1024 || port > 65535) {
System.out.println("Usage: java LineServer [serverPort>1024]");
System.exit(1);
}
} else if (args.length == 0) {
port = PORT;
} else {
System.out.println("Usage: java PutFileServerSeq or java PutFileServerSeq port");
System.exit(1);
}
} //try
catch (Exception e) {
System.out.println("Problemi, i seguenti: ");
System.out.println("Usage: java PutFileServerSeq or java PutFileServerSeq port");
System.exit(1);
}
/*
* preparazione socket e in/out stream
*/
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port, 2);
serverSocket.setReuseAddress(true);
System.out.println("PutFileServerSeq: avviato ");
System.out.println("Creata la server socket: " + serverSocket);
} catch (Exception e) {
System.err.println("Problemi nella creazione della server socket: "
+ e.getMessage());
System.exit(2);
}
try {
while (true) {
Socket clientSocket = null;
DataInputStream inSock = null;
DataOutputStream outSock = null;
System.out.println("\nIn attesa di richieste...");
try {
// bloccante finche' non avviene una connessione
clientSocket = serverSocket.accept();
// visto che il server e' sequenziale se si bloccasse indefinitamente
// sull'unica socket da cui fornisce il servizio, il servizio sarebbe
// ospeso, quindi e' meglio mettere un timeout scaduto il quale
// tornare
// in attesa di richieste
clientSocket.setSoTimeout(30000);
System.out.println("Connessione accettata: " + clientSocket + "\n");
} catch (SocketTimeoutException te) {
System.err.println("Non ho ricevuto nulla dal client per 30 sec., interrompo "
+ "la comunicazione e accetto nuove richieste.");
// il server continua a fornire il servizio ricominciando dall'inizio
continue;
} catch (Exception e) {
System.err.println("Problemi nella accettazione della connessione: "
+ e.getMessage());
// il server continua a fornire il servizio ricominciando dall'inizio
// del ciclo, se ci sono stati problemi
continue;
}
try {
// creazione stream di input e out da socket
inSock = new DataInputStream(clientSocket.getInputStream());
outSock = new DataOutputStream(clientSocket.getOutputStream());
} catch (IOException e) {
System.out.println("Problemi nella creazione degli stream di input/output "
+ "su socket: ");
// il server continua l'esecuzione riprendendo dall'inizio del ciclo
continue;
}
/*
* ricezione file
*/
String nomeFile;
// ricezione del nome
try {
nomeFile = inSock.readUTF();
} catch (SocketTimeoutException ste) {
System.out.println("Timeout scattato: ");
clientSocket.close();
System.out.print("\n^D(Unix)/^Z(Win)+invio per uscire, solo invio per continuare: ");
// il client continua l'esecuzione riprendendo dall'inizio del ciclo
continue;
} catch (Exception e) {
System.out.println("Problemi nella ricezione del nome del file: ");
// servo nuove richieste
continue;
}
FileOutputStream outFile = null;
String esito;
if (nomeFile == null) {
System.out.println("Problemi nella ricezione del nome del file: ");
continue;
} else {
// controllo se il file esiste, se non esiste lo creo, altrimenti
// torno errore
File curFile = new File("C:\\pippo.txt");
if (curFile.exists()) {
try {
esito = "Sovrascritto file esistente";
// distruggo il file da sovrascrivere
curFile.delete();
} catch (Exception e) {
System.out.println("Problemi nella notifica di file esistente: ");
// servo nuove richieste
continue;
}
} else {
esito = "Creato nuovo file";
}
outFile = new FileOutputStream("C:\\pippo.txt");
}
//ciclo di ricezione dal client, salvataggio file e stamapa a video
try {
System.out.println("Ricevo il file " + nomeFile + ": \n");
FileUtility.trasferisci_a_byte_file_binario(inSock,
new DataOutputStream(outFile));
System.out.println("\nRicezione del file " + nomeFile
+ " terminata\n");
// chiusura file
outFile.close();
// chiusura socket in downstream
clientSocket.shutdownInput();
// ritorno esito positivo al client
outSock.writeUTF(esito + ", file salvato lato server");
// System.out.println("\nTerminata connessione con "+clientSocket);
// chiudo la socket anche in upstream
clientSocket.shutdownOutput();
System.out.println("\nTerminata connessione con " + clientSocket);
} catch (SocketTimeoutException ste) {
System.out.println("Timeout scattato: ");
clientSocket.close();
System.out.print("\n^D(Unix)/^Z(Win)+invio per uscire, solo invio per continuare: ");
// il client continua l'esecuzione riprendendo dall'inizio del ciclo
continue;
} catch (Exception e) {
System.err.println("\nProblemi durante la ricezione e scrittura del file: "
+ e.getMessage());
clientSocket.close();
System.out.println("Terminata connessione con " + clientSocket);
continue;
// il server continua a fornire il servizio ricominciando
// dall'inizio del ciclo esterno
}
}
} // qui catturo le eccezioni non catturate all'interno del while
// in seguito alle quali il server termina l'esecuzione
catch (Exception e) {
// chiusura di stream e socket
System.out.println("Errore irreversibile, PutFileServerSeq: termino...");
System.exit(3);
}
}
}