Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    InputStream di una Socket, evitare il bloccaggio

    Salve a tutti, ho cercato in lungo e in largo ma non ho trovato nulla che mi chiarisse le idee.
    Sto implementando un applicazione client che si connette ad un server tramite il protocollo FTP.
    In questo punto:
    codice:
            socket = new Socket(host, port);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            String response = reader.readLine();
            //Si attende un 220
            System.out.println(response);
            if (!response.startsWith("220")) {
            	throw new IOException("I received an unknown response when connecting to the FTP server: " + response);
            }
            writer.write("USER" + user + "\r\n");
            writer.flush();
    
            response = readLine();
            //Si attende un 331
            System.out.println(response);
            if (!response.startsWith("331")) {
                throw new IOException("I received an unknown response after sending the user: " + response);
            }
    Subito dopo l'inizio della connessione, il server dovrebbe inviare il 220 di avvenuta connessione, il problema e' che (testing fatto con il server di Altervista) non invia una sola riga di 220 ma ne invia addirittura 5!!!
    Ecco l'output del server:
    220---------- AlterVista FTP, based on Pure-FTPd [privsep] ----------
    220-Sei l'utente numero 17 di 120 consentiti
    220-L'ora locale è 13:23. Porta del server: 21.
    220-Questo è un sistema privato - Nessun login anonimo
    220 Sarai disconnesso dopo 5 minuti di inattività.
    Ho provato a mettere un ciclo che catturasse tutte le linee per poi inviare writer.write("USER" + user + "\r\n"); ma ovviamente dopo 5 ciclate il programma si blocca in attesa di un output del server che non arriverà mai.
    La mia domanda quindi e' questa: come posso resettare l'inputStream della socket? Ovvero vorrei leggere la prima riga con il 220 e poi eliminare le altre righe con 220 cosi' da inviare writer.write("USER" + user + "\r\n");



    Ho provato anche con il metodo available(), che a quanto ho capito dovrebbe restituire il numero di byte leggibili dal flusso, quindi se restituisce 0 il buffer dell'input dovrebbe essere vuoto.
    codice:
    while(socket.getInputStream().available()>0){
            reader.readLine();
    }
    Cosi' dovrebbe ignorare le altre righe ma non so perche' (forse non ho ben compreso bene il metodo available) non restituisce mai un numero maggiore di 0... eppure ci sono altre 4 righe che il server mi ha inviato che iniziano per 220... non so piu' dove sbattere la testa

  2. #2

    Re: InputStream di una Socket, evitare il bloccaggio

    Originariamente inviato da pier_IP
    Ho provato anche con il metodo available(), che a quanto ho capito dovrebbe restituire il numero di byte leggibili dal flusso, quindi se restituisce 0 il buffer dell'input dovrebbe essere vuoto.
    codice:
    while(socket.getInputStream().available()>0){
            reader.readLine();
    }
    Cosi' dovrebbe ignorare le altre righe ma non so perche' (forse non ho ben compreso bene il metodo available) non restituisce mai un numero maggiore di 0... eppure ci sono altre 4 righe che il server mi ha inviato che iniziano per 220... non so piu' dove sbattere la testa
    Riguardo il metodo available, la documentazione ufficiale dice:
    The available method for class InputStream always returns 0.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ma il fatto che hai 5 risposte non è sintomatico che invii 5 richieste di connessione?
    sicuro che ne invii uno solo?

  4. #4
    Originariamente inviato da valia
    ma il fatto che hai 5 risposte non è sintomatico che invii 5 richieste di connessione?
    sicuro che ne invii uno solo?
    Si si la connessione e' una sola, è il server che invia quelle 5 risposte. Anche facendo la connessione da terminale con il comando ftp <nome_server> a connessione avvenuta risponde con 5 righe.

    The available method for class InputStream always returns 0.
    This method should be overridden by subclasses.
    Gia' ho letto, e' la penultima riga. Non capisco perche', pare che funzioni solo sulle sottoclassi di InputStream.
    Come posso fare allora a resettare l'inputstream della socket?


    E comunque pare che altervista si comporta cosi', ma per esempio il programma vsFTPd che esegue un processo server FTP demone, invia una sola risposta di avvenuta connessione.



    EDIT:
    Credo di aver risolto! Invece di usare il metodo available(), ho usato ready() della classe BufferedReader.
    Pare funzionare...

  5. #5
    Originariamente inviato da pier_IP
    Credo di aver risolto! Invece di usare il metodo available(), ho usato ready() della classe BufferedReader.
    Pare funzionare...
    Si, così va bene. Volendo, nel punto in cui ti aspetti i 5 messaggi, avresti potuto fare:
    codice:
            String lineWanted = reader.readLine();
        	int i = 0;
        	while( ++i < 5 )
        		reader.readLine();
    Ad ogni modo il buffer di lettura va svuotato.

  6. #6
    Originariamente inviato da VincenzoTheBest
    Si, così va bene. Volendo, nel punto in cui ti aspetti i 5 messaggi, avresti potuto fare:
    codice:
            String lineWanted = reader.readLine();
        	int i = 0;
        	while( ++i < 5 )
        		reader.readLine();
    Si e' vero, ma in questo modo funzionerebbe solo sul server di altervista.
    Mi auto quoto.
    E comunque pare che altervista si comporta cosi', ma per esempio il programma vsFTPd che esegue un processo server FTP demone, invia una sola risposta di avvenuta connessione.
    Grazie mille degli aiuti!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.