Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    50

    Simulazione ritardo connessione client

    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 :

    codice:
    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?

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Il metodo setSoTimeout() serve ad imporre un timeout alla socket per quanto riguarda le operazioni di lettura. Questo significa che la lettura dalla socket attenderà solo per il periodo di tempo specificato.

    Il fatto che tu inserisca un ritardo nel client porta alla sola chiusura della socket nel server. Quindi crei i due canali di I/O (che ovviamente non saranno utilizzabili), poi testi se il client è connesso (questo test dovrebbe fallire e di conseguenza non dovrebbe stampare la scritta "Connessione stabilita...") dopodichè entra nel while...

    Non hai inserito alcunchè per dire al client di non entrare nel while...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.