Visualizzazione dei risultati da 1 a 10 su 35

Discussione: Java Client Server

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    La classe ClientConnection, implementa un oggetto che permette di effettuare richieste al server, poichè questo oggetto deve essere disponibile in più classi, secondo voi è fattibile una cosa simile:
    codice:
    public class GestoreConnessione {
        public static final ClientConnection connessione=new ClientConnection();
    }
    da renderlo una specie di variabile globale

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    secondo voi è fattibile una cosa simile:
    da renderlo una specie di variabile globale
    In generale, se vuoi avere un oggetto "singolo" accessibile da qualunque classe, c'è il pattern "singleton" che serve apposta per questo.
    Avere un campo pubblico come quello mostrato da te, no, generalmente non è la cosa migliore.

    Ci potrebbero essere altri "design" che si adattano meglio al tuo caso ma bisognerebbe vedere chi/quanti usano ClientConnection e cosa fa e ci devi fare con quel ClientConnection. Ah, precisa cosa è questa ClientConnection (quale framework/libreria).
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ClientConnection è una classe scritta da me, che ha un campo socket che permette di gestire la connessione col server. un metodo connect che ti fa collegare al server, un metodo download, che scarica informazioni dal server, un metodo insert che invia la server delle informazioni da inserire nel db e cosi via.. il fatto è che ciascuno di questi metodi può anche essere utilizzato in classi diverse, considerando che il software ha un interfaccia grafica .

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Ecco il codice
    codice:
    package jcallremember.client;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.sql.ResultSet;
    
    
    /**
     *
    
    
     * Questa Classe implementa una connessione al server 
     */
    public class ClientConnection {
        private Socket conn;
        private InetAddress address;
        private final int serverPort=40000;
       
        /**
         * Invia al server le informazioni di login e si connette
         * @param login
         * @throws java.net.ConnectException
         * @throws UnknownHostException
         * @throws IOException 
         */
        public void connect(Credenziali login) 
                throws java.net.ConnectException,
                UnknownHostException, IOException{
            this.address=InetAddress.getLocalHost();
            this.conn=new Socket(address,this.serverPort);
            Boolean isConnect;
            OutputStream os = conn.getOutputStream(); 
            ObjectOutputStream obs = new ObjectOutputStream(os);
            obs.writeObject(login);
            InputStream is = conn.getInputStream(); 
            ObjectInputStream ois = new ObjectInputStream(is);
            isConnect = ois.readBoolean();
            if(!isConnect){
                   throw new java.net.ConnectException("Username o Password"
                                + " inesatte!");
            }
        }
            
            
        public void connect
        
        public ResultSet downloadImpegniDelGiorno(){
            String query="Select * from Cliente where ";
            return null;
        }
          
    }
    COnsidera che non è completo e che ci sono degli errori! E' piuttosto per darti un' idea.
    Il metodo connect è perfettamente funzionante.
    Sinceramente però non capisco come applicare a questa classe il pattern singleton !
    Ultima modifica di linux_r; 08-04-2014 a 17:48

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    ClientConnection è una classe scritta da me
    Ok.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Sinceramente però non capisco come applicare a questa classe il pattern singleton !
    Al massimo potrebbe essere "singleton" la classe GestoreConnessione .... non ClientConnection.
    ClientConnection mi pare più sensato che sia una normale classe, con metodi di istanza che forniscono le "primitive" del tuo protocollo di comunicazione, nascondendo i dettagli tecnici interni.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    considerando che il software ha un interfaccia grafica
    Intendi interfaccia Swing? Allora considera anche tutte le implicazioni sul threading in Swing, ovvero il networking non dovrebbe essere fatto nel contesto del Event Dispatch Thread ma in un thread a parte (con quello che ne comporta).


    P.S. quando scrivi qualunque cosa su socket, es. con writeObject, ricordati sempre di fare un bel flush() !

    P.S. 2: e comunque non è detto che il concetto di singleton sia appropriato nel tuo caso. Bisognerebbe capire/vedere di più di quanto devi fare.
    Ultima modifica di andbin; 08-04-2014 a 18:08
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da andbin Visualizza il messaggio
    ClientConnection mi pare più sensato che sia una normale classe, con metodi di istanza che forniscono le "primitive" del tuo protocollo di comunicazione, nascondendo i dettagli tecnici interni.
    Quindi va bene cosi ClientConnection?

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Intendi interfaccia Swing? Allora considera anche tutte le implicazioni sul threading in Swing, ovvero il networking non dovrebbe essere fatto nel contesto del Event Dispatch Thread ma in un thread a parte (con quello che ne comporta).
    Ma ad esempio se ho un form dove mi si chiede di inserire user e pass, e quando premo il tasto ok le info vengono inviate al server mediante un action listener installato sul button "ok", in quell'action listener , e quindi nel suo metodo actionPerformed , posso usare la classe ClientConnection ad esempio(Supponendo che non mi occorra "globale") e inviare tali informazioni? però poi sarebbe un lavoro compiuto dall'evt . QUindi o dovrei implementare runnable su ClientConnection oppure creare un nuovo Thread all'interno dell'actionperformed e comunque dire all'evt di aspettare che esso termini per verificare che la connessione è avvenuta? Cosa proponi?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Inoltre volevo chiederti quando devo utilizzare altri metodi per contattare il server, poichè se chiudo gli stream si chiude il socket , nelgli altri metodi posso richiamare nuovoamente getOutputStream ?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Quindi va bene cosi ClientConnection?
    Quanto hai postato è poco, quindi non posso dire se è e sarà davvero ok. A grandi linee sì. Vedo che come address hai preso fisso il "localhost" e la porta è anch'essa fissa. Se ti serve solo così, ok, altrimenti sarebbe più flessibile poter configurare address+port.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Ma ad esempio se ho un form dove mi si chiede di inserire user e pass, e quando premo il tasto ok le info vengono inviate al server mediante un action listener installato sul button "ok", in quell'action listener , e quindi nel suo metodo actionPerformed , posso usare la classe ClientConnection ad esempio(Supponendo che non mi occorra "globale") e inviare tali informazioni? però poi sarebbe un lavoro compiuto dall'evt . QUindi o dovrei implementare runnable su ClientConnection oppure creare un nuovo Thread all'interno dell'actionperformed e comunque dire all'evt di aspettare che esso termini per verificare che la connessione è avvenuta? Cosa proponi?
    Tutte le operazioni con un oggetto della tua ClientConnection sarebbero da fare in un thread a parte, non nel EDT. Questo ovviamente complica un po' le cose ma si può fare e in svariati modi .... dipende da quanto sei ferrato su thread e sincronizzazione in generale.

    Un possibile scenario è avere un thread a parte che si occupa di tutta la comunicazione. Visto che non si può "invocare" qualcosa nel contesto di un altro thread, generalmente per far comunicare/cooperare 2 o più thread si usano delle strutture dati sincronizzate. In questo caso basta una "coda" sincronizzata, thread-safe e ovviamente condivisa tra EDT e il thread di comunicazione. Il thread che opera sul networking è sempre in attesa, bloccato, di "comandi". Tu pubblichi sulla coda un "comando" (modellato con un oggetto, es. la "connessione" o l' "invio" di un dato) e l'altro thread si sblocca ed opera il comando. Appena ha dei risultati, potrebbe fare in modo che venga eseguito nel EDT un Runnable che magari aggiorna qualcosa sulla interfaccia grafica.

    Diventa molto asincrono, certo ma è fattibile. Nulla di tutto questo è davvero "difficile" ma bisogna essere un po' "versatili" su thread, sincronizzazione e un po' su strutture dati basilari.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Inoltre volevo chiederti quando devo utilizzare altri metodi per contattare il server, poichè se chiudo gli stream si chiude il socket , nelgli altri metodi posso richiamare nuovoamente getOutputStream ?
    No, una volta che il socket è chiuso non puoi più riaprire la comunicazione con quello stesso oggetto Socket. Devi istanziare un nuovo oggetto Socket.
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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.