Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    7

    [JAVA] Chiudere Connessione

    Ciao a tutti,
    mi e stato dato un compitino dove un client ed un server ftp dialogano ed io devo scrivere parti di codice mancanti.
    So che il codice é un po' strano (non so se di proposito o altro), ma in ogni caso ho un problema nel chiudere la connessione una volta aperta.
    In pratica il client apre la connessione dichiarando Input Stream, Output Stream e socket all interno di questo metodo dichiarato private:
    codice:
        private void openConnection(String host) throws IOException
        {
            Socket socket = new Socket(host, PORT);
            InputStream is = socket.getInputStream();
    
            fromServer = new BufferedReader(new InputStreamReader(is));
    
            OutputStream os = socket.getOutputStream();
            toServer = new PrintWriter(os, true);
        }
    Il prof ci chiede di chiudere la connessione in un altro metodo (private void doClose() ) senza modificare niente in openConnection(String host).
    Se io chiamo

    socket.close(), is.close(), os.close()

    non me li trova perché dichiarati privati.
    Esiste un modo per chiuderli non modificando openConnection()? (forse utilizzando fromServer e toServer ma come?)
    Grazie a tutti per l'aiuto
    Strider
    Strider
    "Due cose sono infinite: l’universo e la stupidità umana, ma riguardo l’universo ho ancora dei dubbi." A.Einstein

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68
    Quando parli di chiudere la connessione presumo tu ti riferisca alla chiusura del socket che hai istanziato all'interno del metodo openConnection. In questo caso è impossibile chiuderlo da un altro metodo in quanto il socket ha lo scope limitato al corpo della funzione in cui è stato istanziato. Sarebbe diverso se invece ti trovassi in questa situazione:
    codice:
    Socket soc = null;
    private void openConnection(String host) throws IOException {
        soc = new Socket(host, PORT);
        //...
    }
    private void doClose() throws IOException {
        if (soc != null) soc.close();
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    7
    Ti ringrazio per l'aiuto, hai perfettamente capito quello che volevo dire, e mi fa piacere vedere che mi confermi quello che pensavo anche io, ovvero che se il socket (ed il resto) é dichiarato all'interno del metodo (private) non lo posso chiudere partendo da un altro metodo (anch'esso private).
    Se qualcuno dovesse conoscere un'altro metodo lo prego vivamente di smentirci (cosí posso fare il compitino come richiesto).
    Ciao
    Strider
    "Due cose sono infinite: l’universo e la stupidità umana, ma riguardo l’universo ho ancora dei dubbi." A.Einstein

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da strider
    Ti ringrazio per l'aiuto, hai perfettamente capito quello che volevo dire, e mi fa piacere vedere che mi confermi quello che pensavo anche io, ovvero che se il socket (ed il resto) é dichiarato all'interno del metodo (private) non lo posso chiudere partendo da un altro metodo (anch'esso private).
    Cosa c'entra il fatto che i metodi siano private? Avresti lo stesso "problema" anche se fossero public, protected o "default"!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    7
    Alex'87 innanzitutto grazie per la risposta, piú gente risponde piú facile trovare una soluzione. In secondo luogo, scusa se ho urtato la tua sensibilitá di programmatore, come detto in un precedente post ieri, sono nuovo alla programmazione ed a Java e cerco di dare piú informazioni possibili nei miei post, COMUNQUE non mi sembra il caso di inca22arsi tanto per un post (
    Cosa c'entra il fatto che i metodi siano private?
    é solo un post! per diammine ci sono cose ben piú importanti in questo mondo!
    Comunque a parte la polemica, ritorno con il mio questito originario, perché ho chiesto al mio tutor e lui sostiene che un modo c'è.
    Quindi per evitare ulteriori fraintendimenti ecco il codice, praticamente è un client FTP che apre una connessione con il server e quindi deve (nel metodo doClose) chiudere la connessione, il mio problema é che io sono riuscito a chiuderla solo modificando la dichiarazione di Socket, Input ed Output stream.
    Nel codice potete cercare per Problema che ho per trovare i due metodi con cui ho problemi.
    Come sempre grazie a tutti per l'aiuto e le risposte (anche a te Alex anche se ti incazzi ;-) .
    Ciao
    Strider
    :
    codice:
    /*
     * FTPClient.java - skeleton class
     *
     */
    package client;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class FTPClient
    {
        private static final int PORT = 8198;
        private static final String EOF = "EOF";
        private final Scanner keyboard;
        private BufferedReader fromServer;
        private PrintWriter toServer;
        private String host;
        private boolean connected;  //are we currently connected to server?
        private String clientText;  //text client entered from keyboard
        private String command;     //the last client command entered (e.g., DIR)
        private String args;        //anything after the command (its arguments)
        private boolean cont;       //keep the client running if true
        
        /**************************** utilizzando queste dichiarazioni funziona *****************************/
            // Streams used for connecting to server
        //private InputStream is;
        //private OutputStream os;
        // Socket to server
        //private Socket socket;              
    	
        /**********************************************fine*******************************/
    	
    	// Sring for messages coming from the server
        private String messageFromServer;
        
        //provided constructor
        public FTPClient()
        {
            host = "localhost";
            connected = false;
            keyboard = new Scanner(System.in);
            cont = true;
        }
        
        /* **************** Methods to process the individual commands *****************/
    
        private void doOpen()
        {        
            String hS;
            if (noArgs())
            {
                hS = args;
            }
            else
            {
                hS = host;
            }
            
            //check for connection status
            if (!connected)
            {
                System.out.println("Trying to open connection to: " + hS);
                //try to open a connection to the host
                try
                {
                    openConnection(hS);
                    connected = true;
                    
                    // Send Command to server
                    sendToServer("OPEN");
                    sendToServer("Hello from the FTPClient");
                    
                    //display the server response
                    displayServerResponse();                
                }
                catch (IOException e)
                {
                    System.out.println("Trouble contacting the server " + e);
                }
            }
            else
            {
                System.out.println("Connection to " + hS + " already open!");
            }
        }
        
      // Prolema che ho parte 1 Metodo che non riesco a usare se altero OpenConnection(String 
    //toHost)
      
        private void doClose()
        {
            try
            {
                sendToServer("CLOSE");
                // Close Streams to server     
                closeStreams();
                // Close socket connection to server     
                socket.close();
                System.out.println("Connection to Server closed");
            }
            catch(IOException e)
            {
                System.out.println("Probelms by closing of the connection: " + e);
            }
        }
        
        private void closeStreams() throws IOException
        {
            fromServer.close();
            is.close(); 
            connected = false;
        }
            
        //BYE implies that we no longer want to continue this session.
        //If connected, we also close the connection to the server
        //This is a provided method
        private void doBye()
        {
            cont = false; //the only case where we don't continue
            
            if (connected)
            {
                //Server does not understand BYE
                clientText = "CLOSE";
                doClose();
            }
            else
            {
                System.out.println("Bye bye...");
            }
        }
        
        /* ************************ Other helper methods *****************************/
        //This method sets the clientText variable, which contains
        //everything the client typed at the command line. 
        //It also sets the value of command - the first thing on the line of client text
        //and args - anything else on the line after the command.
        //Note that we send the clientText to the server when required,
        //rather than the command and args, which are for local use.
        private void setClientText()
        {
            clientText = keyboard.nextLine().trim();
            
            Scanner sc = new Scanner(clientText);
            
            if (sc.hasNext())
            {
                command = sc.next().toUpperCase(); //allow lowercase
            }
            else
            {
                command = "";
            }
            
            if (sc.hasNext())
            {
                args = sc.nextLine().trim(); //trim required using this approach
            }
            else
            {
                args = ""; //empty
            }
        }
        
        //this method is provided
        private void openConnection(String host) throws IOException
        {
            /**************************** utilizzando queste dichiarazioni funziona *****************************/
            //socket = new Socket(host, PORT);
            //is = socket.getInputStream();
    		//os = socket.getOutputStream();
    		/**************************** Problema che ho *****************************/
    		Socket socket = new Socket(host, PORT);
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
                    
            fromServer = new BufferedReader(new InputStreamReader(is));
            toServer = new PrintWriter(os, true);
        }
        
        //Send a string to the server.
        private void sendToServer(String text)
        {
            toServer.println(text);
        }    
      
        //Display all feedback from the server up to EOF
        private void displayServerResponse()
        {       
            try
            {
                messageFromServer = fromServer.readLine();
                while(messageFromServer != null && !messageFromServer.equals("EOF"))
                { 
                   System.out.println(messageFromServer);
                   messageFromServer = fromServer.readLine();   
                }
            }
            catch (IOException e)
            {
                System.out.println("Trouble while getting reply from server: " + e);
            }              
        }
        
             
        //Returns true if there is nothing that looks like an argument
        //after the client's command, based on the current args value
        private boolean noArgs()
        {
            return (args == null || "".equals(args));
        }    
        
        //this is not very extensible, but is simple to follow
        private void processCommand()
        {
            if ("OPEN".equals(command))
            {
                doOpen();
            }
            else if ("LIST".equals(command))
            {
                doList();
            }
            else if ("DIR".equals(command))
            {
                doDir();
            }
            else if ("PUT".equals(command))
            {
                doPut();
            }
            else if ("CLOSE".equals(command))
            {
                doClose();
            }
            else if ("BYE".equals(command))
            {
                doBye();
            }
            else
            {
                System.out.println("Command " + command + " is not supported.");
            }
        }
        
        /*************  The main method used by the client application ********/
        //execute a command read from the keyboard
        public void run()
        {
            System.out.println("ready for input - use OPEN to connect to server ");
            System.out.println("To end the session use BYE");
            System.out.println("-------------------------------------------------\n");
            System.out.println(">");
            do
            {
                setClientText();
                System.out.println(">" + clientText); //echo
                
                processCommand();
                
                //show the command prompt again
                System.out.println(">");
            }
            while (cont);
            
            System.out.println("FTP client has stopped running");
        }
    }
    Strider
    "Due cose sono infinite: l’universo e la stupidità umana, ma riguardo l’universo ho ancora dei dubbi." A.Einstein

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68
    Scorrendo velocemente il tuo codice non mi viene in mente nessun modo per chiudere esplicitamente il socket con il metodo close() , tuttavia tieni presente che la chiusura di un socket avviene automaticamente quando uno dei suoi stream si chiude, o alla fine del programma o quando finisce out-of-scope. Il tuo codice rientra in quest'ultimo caso, tuttavia però i suoi stream sono ancora ancorati agli oggetti fromServer e toServer, pertanto magari la chiusura la devi ottenere implicitamente chiudendo loro.

    Onestamente ti dico che non comprendo molto questa scelta di implementazione, ma poichè anchio sono agli inizi con Java magari mi sfugge quali siano i suoi "punti di forza". Fosse stato per me avrei implementato un socket come field della classe come ti ho mostrato nel primo codice che ti ho postato. Magari se il tu tutor ti saprà dirti qualcosa di più su questa scelta mi farebbe piacere capire gli eventuali perchè.

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da strider
    Alex'87 innanzitutto grazie per la risposta, piú gente risponde piú facile trovare una soluzione. In secondo luogo, scusa se ho urtato la tua sensibilitá di programmatore, come detto in un precedente post ieri, sono nuovo alla programmazione ed a Java e cerco di dare piú informazioni possibili nei miei post, COMUNQUE non mi sembra il caso di inca22arsi tanto per un post (
    é solo un post! per diammine ci sono cose ben piú importanti in questo mondo!
    Comunque a parte la polemica, ritorno con il mio questito originario, perché ho chiesto al mio tutor e lui sostiene che un modo c'è.
    Ehm... O_o Non hai urtato la mia sensibilità :master: E non mi pare di essere stato polemico!

    Originariamente inviato da strider
    Come sempre grazie a tutti per l'aiuto e le risposte (anche a te Alex anche se ti incazzi ;-) .
    Non mi sono incazzato
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.