PDA

View Full Version : [JAVA]Simulazione ritardo connessione client


EnZiMa
09-09-2007, 15:44
Ho un problemino con la comunicazione tra client e server.

Ho un server che ha una serverSocket che rimane in ascolto con un timeout di 5 secondi.

ecco il codice del client :


private void connetti(String ip, int porta) {

try {

Socket clientSocket = new Socket(ip, porta);
clientSocket.setSoTimeout(5000);
Thread.sleep(7000); //Simulazione di ritardo

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

if(clientSocket.isConnected())
System.out.println("Connessione stabilita con il Server "+format(clientSocket)+"\n");

while (true) {
System.out.print("Client > ");
String userInput = stdIn.readLine();

if(userInput.equalsIgnoreCase("quit")){
System.out.println("Connessione terminata con il Server "+format(clientSocket));
break;
}
else if(clientSocket.isClosed()){
System.out.println("Connessione terminata con il Server "+format(clientSocket));
break;
}
out.println(userInput);
out.flush();
}

stdIn.close();
in.close();
out.close();
clientSocket.close();

} catch (UnknownHostException e) {
System.out.println("Impossibile connettersi al Server "+ip+":"+porta+" Host sconosciuto!");
} catch (IOException e) {
System.out.println("Errore nella connessione con il Server "+ip+":"+porta);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


Volendo simulare un ritardo ho inserito nel client Thread.sleep(7000), in questo modo dopo aver creato il socket aspetta 7 secondi, nel frattempo il server ha chiuso la socket....il problema č che mi inizializza lo stesso gli stream ed entra lo stesso nel ciclo while...come mai? :mc: :confused:

Grazie :)

PGI-Bis
09-09-2007, 16:24
In breve, quel costruttore crea e connette in un colpo solo. Usa il costruttore senza argomenti ed il metodo "bind" del socket per connetterlo dopo l'inizializzazione.

Aggiunto: in che senso entra comunque nel while?

qwerty86
09-09-2007, 16:59
while (true) {





ci entra sempre!:)

PGI-Bis
09-09-2007, 17:22
La chiusura del socket da parte del server comporta la restituzione di un -1 in lettura lato client.

In altre parole, quando la documentazione parla di eccezione in caso di chiusura si riferisce alla chiusura invocata sull'oggetto socket, non alla chiusura della controparte sul server.

Nel tuo codice questo dovrebbe apparire in forma di NullPointerException quando tenti di usare userInput. E' cosė?

EnZiMa
09-09-2007, 18:15
ci entra sempre!:)

ops...giusto :p

pero ci entra anche cosi
while(clientSocket.isConnected()){} :doh:

PGI-Bis
09-09-2007, 18:26
Tutti gli stati del socket sono "locali". Ad esempio se fai:

socket.close();

e poi, su quel socket lė (non sulla controparte creata dal server) invochi:

socket.isClosed();

allora otterrai un true.

E' la lettura a dirti se il Socket sia connesso.

int read = socket.getInputStream().read();
if(read == -1) { paff, il flusso in entrata č chiuso! }