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

    Progetto "AstaOnLine" con i Socket Java

    Salve,

    Scrivo per chiedervi aiuto su un progetto da realizzare, di seguito vi allego la traccia:

    Si vuole realizzare un sistema Asta On-Line, per quanto riguarda le funzionalità di registrazione e pubblicazione degli oggetti, e delle connessioni Socket TCP, per la trasmissione e la ricezioni dei dati con il sistema centrale. Ogni utente, utilizzatore del sistema, deve essere registrato. I dati di avvenuta registrazione, userID e password, sono contenuti in un file “registration.txt”. La descrizione dell’oggetto e i dati relativi all’asta (base d’asta, ora d’inizio asta, ora di chiusura asta, ecc..) sono anche essi contenuti in un file “Descrizione_Oggetto.txt ” Un utente che intende partecipare all’asta deve contattare (instaurando una connessione con Socket TCP) il sistema centrale prima dell’ora di inizio asta. Le offerte valide ai fini dell’asta sono quelle pervenute al sistema centrale dopo l’ora di inizio e prima dell’ora limite. Scaduta l’ora limite il sistema deve comunicare a tutti gli utenti l’esito dell’asta. ALTRI REQUISITI: - Un utente non loggato può vedere l'asta ma non può fare offerte (realizzabile chiedendo il login quando si tenta di fare un offerta) - In fase di registrazione il server deve aggiungere l'utente alla lista degli utenti registrati e deve dar lui i privilegi x poter far offerte e caricare oggetti - Deve essere tutto crittografato tranne il multicast
    Vorrei qualche linea guida su come muovermi, considerato che è la prima volta che mi affaccio ai socket non ho le idee ben chiare,
    ho già scritto un bel pò di codice prendendo spunto da un progetto pre-esistente, tuttavia devo rivedere bene tutto quanto, resto in attesa di vostri consigli e aiuti,
    ringraziandovi anticipatamente

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Moderazione

    Originariamente inviato da InfoLuca
    Vorrei qualche linea guida su come muovermi, considerato che è la prima volta che mi affaccio ai socket non ho le idee ben chiare
    Su cosa non hai le idee ben chiare: argomenta con precisione quali sono i tuoi dubbi ed eventualmente posta il codice che hai scritto se si tratta di errori o comportamenti anomali del tuo programma, altrimenti non è chiaro su cosa nello specifico si debba dare suggerimento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Dunque il problema principalmente è capire come far comunicare server e client più volte, cioè non si tratta della solita richiesta singola al server che poi risponde al client e finisce la, creando dei metodi, per esempio l’invio dell’offerta relativa ad un asta dopo che si è visualizzato l’elenco delle aste disponibili e si è fatto il login…

    Qui di seguito vi allego il codice che fino ad ora ho scritto, consapevole che deve essere modificato:

    codice:
     
    *****************************CLASSE  CLIENT*******************
    
    
        
    package AstaCrittografata;
    
    /**
     *
     * @author Luca
     */
    import java.io.*;
    import java.net.*;
    import java.security.KeyFactory;
    import java.security.PublicKey;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Arrays;
    import javax.crypto.Cipher;
    import AstaCrittografata.Inserzione;
    
    /**
     * Questo è un esempio di un'applicazione che garantisce la segretezza della
     * comunicazione, in quanto cifra i dati da inviare verso il server con la
     * chiave pubblica comunicat dal server stesso. Solo il server sarà capace di
     * decifrare questi dati, in quanto è l'unico che dispone della chiave privata
     * accoppiata alla chiave pubblica.
     *
     * @author Raffaele Giordanelli
     *
     */
    class AstaClient {
        GestoreUtenti gestU=new GestoreUtenti();
        int serverPort;
        int myPort;
        InetAddress groupAddress;
        InetAddress serverAddress;
        Socket s;
      
        // Cryptography: begin
        // Socket per richiedere la chiave pubblica del asta server
        Socket gks;
        // Porta del server e socket a cui richiedere la chiave pubblica
        int getKeyServerPort;
        // Cipher per cifrare i dati da inviare al server
        Cipher cipher;
        // Cipher per decifrare i dati da inviati dal server
        Cipher decipher;
        // Cryptography: end
        protected Utente u = new Utente();
        protected boolean Uloggato;
    
        public AstaClient(Utente u, InetAddress gAddress, InetAddress server, int sPort, int mPort, int gkServerPort) {
            this.u=u;
            groupAddress = gAddress;
            serverAddress = server;
            serverPort = sPort;
            myPort = mPort;
            getKeyServerPort = gkServerPort;
            try {
                s = new Socket(serverAddress, serverPort);
    
                // Cryptography: begin
                // Inizializzazione del socket per richiedere la chiave pubblica del
                // asta server
                gks = new Socket(serverAddress, getKeyServerPort);
                // Cryptography: end
    
            } catch (IOException ioe) {
                System.out.println(ioe);
            }
            Uloggato = false;
        }
    
        /**
         * Legge la chiave pubblica inviata dal server, e tramite questa inizializza
         * i due cifrari RSA in modalità cifratura e decifratura
         */
        public void makeCipher() {
            try {
                // Cryptography: begin
                // Recupero gli Stream di comunicazione
                InputStream inGetKey = gks.getInputStream();
                OutputStream outGetKey = gks.getOutputStream();
    
                // Richiedo la chiave publica del Asta Server
                outGetKey.write(1);
    
                // Salvo la chiave inviata dal server in publicKeyBytes
                byte[] publicKeyBytes = new byte[1000];
                int numByte = inGetKey.read(publicKeyBytes);
                publicKeyBytes = Arrays.copyOf(publicKeyBytes, numByte);
    
                // Inizializza convertitore da X.509 a chiave pubblica
                X509EncodedKeySpec ks = new X509EncodedKeySpec(publicKeyBytes);
                // Inizializza un KeyFactory per ricreare la chiave usando RSA
                KeyFactory kf = KeyFactory.getInstance("RSA");
                // Crea una chiave pubblica usando generatePublic di KeyFactory in
                // base la chiave decodificata da ks
                PublicKey publicKey = kf.generatePublic(ks);
    
                // Inizializzo un cifrario che usa come algoritmo RSA, come modalità
                // ECB e come padding PKCS1
                cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    
                // Lo inizializzo dicendo modalità di codifica e chiave pubblica da
                // usare
                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    
                // Inizializzo un cifrario che usa come algoritmo RSA, come modalità
                // ECB e come padding PKCS1
                decipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    
                // Lo inizializzo dicendo modalità di codifica e chiave pubblica da
                // usare
                decipher.init(Cipher.DECRYPT_MODE, publicKey);
    
                // Cryptography: end
            } catch (Exception e) {
                System.out.println(e);
            }
    
        }
    
        
        public boolean InviaLoginClient(String user, String password) throws IOException {
             
      
            makeCipher();
            String e = "";
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                OutputStream out = s.getOutputStream();
    
                byte[] dati = cipher.doFinal((" " + user +" "+ password).getBytes());
                out.write(dati);
    
                e = in.readLine();
            } catch (Exception err) {
                System.out.println(err);
            }
            
            
             if(e.equals("true")){
                 Uloggato=true;
                 return true;
                }
            return false;
    
        }
    //******FINIRE CON REGISTRAZIONE UTENTE E CREAZIONE SE NON è LOGGATO
        public boolean CreaOfferta(int ID, double importo) throws FileNotFoundException, IOException {
          boolean esito=false;
            Uloggato=gestU.verificaPresenza(u.getUserId(), u.getPassword());
            if (Uloggato == false) {
                System.out.println("#ERRORE! - Eseguire il login per fare offerte!");}
                else{
            // controllare il ricevi prezzo corrente
            // Cryptography: begin2
            // Creo il Cipher per criptare i dati inviati
            makeCipher();
            // Cryptography: end
    
            String e = "";
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                OutputStream out = s.getOutputStream();
    
                byte[] asta = cipher.doFinal((" " + importo).getBytes());
                out.write(asta);
    
                e = in.readLine();
            } catch (Exception err) {
                System.out.println(err);
            }
            esito=true;
            return e.equals("Offerta accettata.");
            
            
        }
        return esito ;
        }
    
        /**
         * Riceve l'elenco dei vincitori inviato dal server in multicast a tutti i
         * client
         */
        public void riceviElenco() {
            try {
                MulticastSocket socket = new MulticastSocket(myPort);
                socket.joinGroup(groupAddress);
    
                byte[] buf = new byte[128];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
    
                // Cryptography: begin
                String elenco = new String(decipher.doFinal(packet.getData()));
                // Cryptography: end
    
                System.out.println("Elenco vincitori: ");
                System.out.println(elenco);
    
            } catch (IOException ioe) {
                System.out.println(ioe);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    
         public void riceviPrezzoCorrente() {
            try {
                MulticastSocket socket1 = new MulticastSocket(myPort);
                socket1.joinGroup(groupAddress);
    
                byte[] buf = new byte[128];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket1.receive(packet);
    
                // Cryptography: begin
                String prezzo = new String(decipher.doFinal(packet.getData()));
                // Cryptography: end
    
                System.out.println("PrezzoCorrente ");
                System.out.println(prezzo);
    
            } catch (IOException ioe) {
                System.out.println(ioe);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
        
        
        
        public static void main(String[] args) throws FileNotFoundException, IOException {
           Utente uTemp=new Utente();
           Utente u=uTemp.RegistrazioneU();
            int serverPort = 8001;
            int myPort = 8002;
    
            // Cryptography: begin
            int getKeyServerPort = 8443;
            // Cryptography: end
            Orario inizio = new Orario(29, 5, 2012, 18, 1);
            Orario fine = new Orario(29, 5, 2012, 18, 5);
            int id = 1;
            String s = "seggia";
            double base = 10.0;
            double baser = 1.0;
            Inserzione ins1 = new Inserzione(id, s, base, baser, base, inizio, fine);
    
            try {
                InetAddress group = InetAddress.getByName("230.0.0.1");
                InetAddress server = InetAddress.getByName("127.0.0.1");
    
                AstaClient client = new AstaClient(u,group, server, serverPort, myPort, getKeyServerPort);
    
    
    //super(1,"descrizione",10.0,1,inizio,fine);
                double importoff = ((double) (Math.random() * 10)) + 1;
                if (client.CreaOfferta(1, importoff)) {
                    client.riceviElenco();
                }
    
    
            } catch (UnknownHostException uhe) {
                System.out.println(uhe);
            }
    
        }// main
    }// AstaClient
    Ho creato inoltre altre classi (classe GestoreInserzione e classe GestoreUtente) per la gestione di inserzioni e degli utenti su file, oltre alla creazione della classe utente ,

    di seguito vi posto la classe Server....

  4. #4
    codice:
    package AstaCrittografata;
    
    /**
     *
     * @author Matteo
     */
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.*;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.util.*;
    import javax.crypto.Cipher;
    import AstaCrittografata.Inserzione;
    import java.io.*;
    
    /**
     * Questo è un esempio di un'applicazione che garantisce autenticazione del
     * mittente. Il server genera una coppia di chiavi e comunica la chiave pubblica
     * a chi ne fa richiesta. In seguito ogni comunicazione in uscita sarà cifrata
     * con la chiave privata. I client, che decifrano i messaggi con la chiave
     * pubblica sapranno che può essere stato solo questo server ad inviare i dati,
     * perché è l'unica entità a disposizione della chiave privata originale.
     *
    
     *
     */
    class AstaServer {
        protected GestoreUtenti gestU=new GestoreUtenti();
        private ArrayList< Offerta> offerte;
        private Calendar limite;
        private AstaAccepter accepter;
        private AstaDenier denier;
        private int port;
        // Cryptography: begin
        // Thread per la gestione dell'invio della chiave pubblica
        private InviaKey inviaKey;
        // Cipher per la decifrazione dei dati inviati dallo scommettitore
        private Cipher decipher;
        // Cipher per la cifrazione dei dati da inviare allo scommettitore
        private Cipher cipher;
        // Coppia di chiavi pubblica e privata
        KeyPair kp;
    
        // Cryptography: end
        public AstaServer(int port, int getKeyPort, Calendar deadline) {
    
            // Cryptography: begin
            // Avvio il server per l'invio della chiave pubblica
            inviaKey = new InviaKey(getKeyPort);
            inviaKey.start();
            // Cryptography: end
    
            offerte = new ArrayList< Offerta>();
            limite = deadline;
            this.port = port;
            accepter = new AstaAccepter(port);
            accepter.start();
        }
    
        /**
         * Thread per la gestione dell'invio della chiave pubblica
         *
         * @author Raffaele Giordanelli
         */
        private class InviaKey extends Thread {
    
            private int inviaKeyPort;
            private ServerSocket servInviaKey;
    
            InviaKey(int p) {
                try {
                    // Creazione del ServerSocket sulla porta inviaKeyPort
                    inviaKeyPort = p;
                    servInviaKey = new ServerSocket(inviaKeyPort);
    
                    // inizializza un generatore di coppie di chiavi usando RSA
                    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
                    kpg.initialize(1024);
                    // genera la coppia
                    kp = kpg.generateKeyPair();
    
                    // Inizializzo un cifrario che usa come algoritmo RSA, come
                    // modalità ECB e come padding PKCS1
                    decipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
                    // Lo inizializzo dicendo modalità di codifica e chiave privata
                    // da usare
                    decipher.init(Cipher.DECRYPT_MODE, kp.getPrivate());
    
                    // Inizializzo un cifrario che usa come algoritmo RSA, come
                    // modalità ECB e come padding PKCS1
                    cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
                    // Lo inizializzo dicendo modalità di codifica e chiave privata
                    // da usare
                    cipher.init(Cipher.ENCRYPT_MODE, kp.getPrivate());
    
                } catch (Exception e) {
                    System.err.println(e);
                }
            }
    
            @Override
            public void run() {
                try {
                    while (true) {
                        Socket s = servInviaKey.accept();
    
                        InputStream in = s.getInputStream();
                        in.read();
    
                        OutputStream out = s.getOutputStream();
                        out.write(kp.getPublic().getEncoded());
                        out.close();
                    }
                } catch (IOException ioe) {
                    System.err.println(ioe);
                }
            }
        }
    
        /**
         * Thread per gestire le offerte ricevute in tempo utile
         *
         * @author Raffaele Giordanelli
         *
         */
        class AstaAccepter extends Thread {
    
            private int port;
            private ServerSocket serv;
            private boolean accept;
            
            AstaAccepter(int p) {
                try {
                    port = p;
                    serv = new ServerSocket(port);
                    accept = true;
                } catch (IOException ioe) {
                    System.err.println(ioe);
                }
            }
    
            
            
            
            
            @Override
            public void run() {
         
         
        
                
                while (accept) {
                    try {
                        Calendar now = Calendar.getInstance();
                        serv.setSoTimeout((int) (limite.getTimeInMillis() - now.getTimeInMillis()));
                        Socket k = serv.accept();
                        InputStream in = k.getInputStream();
                        PrintWriter out = new PrintWriter(k.getOutputStream(), true);
    
                        // Cryptography: begin
                        // Salvo la scomemssa inviata al server
                        byte[] offertaBytes = new byte[1000];
                        int numByte = in.read(offertaBytes);
                        offertaBytes = Arrays.copyOf(offertaBytes, numByte);
                        byte[] offertaDecriptata = decipher.doFinal(offertaBytes);
    
                        // Cryptography: begin
    
                        String line = new String(offertaDecriptata);
    
                        System.out.println("offerta decifrata=" + line);
    
                        int pos = line.indexOf(" ");
                        
                        double importo = Double.parseDouble(line.substring(pos + 1));
                        InetAddress ip = k.getInetAddress();
    
                        Offerta s = new Offerta(importo, ip);
                       
                        offerte.add(s);
    
                        // manda ok
                        out.println("Offerta accettata.");
                        out.close();
                        k.close();
                        System.out.println("Ricevuta offerta " + ip + " " + " " + importo);
    
                    } catch (SocketTimeoutException ste) {
                        accept = false;
                        System.out.println("Tempo a disposizione per le offerte terminato");
                    }// catch
                    catch (IOException ioe) {
                        System.err.println(ioe);
                    } catch (Exception e) {
                        System.err.println(e);
                    }
                }// while
                try {
                    serv.close();
                } catch (IOException ioe) {
                    System.out.println(ioe);
                }
            }// run
        }// AstaAccepter
    
        /**
         * Thread per gestire le offerte ricevute fuori tempo massimo
         *
         * @author Raffaele Giordanelli
         *
         */
       
        
        
        
        class AstaDenier extends Thread {
    
            private int port;
            private ServerSocket serv;
            private boolean closed;
    
            AstaDenier(int p) {
                try {
                    port = p;
                    serv = new ServerSocket(port);
                    closed = true;
                } catch (IOException ioe) {
                    System.err.println(ioe);
                }
            }
    
            public void reset() {
                closed = false;
            }
    
            public void run() {
                try {
                    while (closed) {
                        //controllare chiusura inserzione 
                        Socket k = serv.accept();
                        PrintWriter out = new PrintWriter(k.getOutputStream(), true);
                        out.println("Offerte chiuse");
                        out.close();
                        k.close();
                        System.out.println("Rifiutata offerta");
                    }// while
                    serv.close();
                } catch (IOException ioe) {
                    System.err.println(ioe);
                }
            }// run
        }// AstaDenier
    
        /**
         * Attende fino al termine del thread AstaAccepter. Quando il metodo
         * termina, le offerte sono automaticamente chiuse.
         */
        public void attendiChiusuraOfferte() {
            try {
                accepter.join();
            } catch (InterruptedException ie) {
                System.err.println(ie);
            }
        }
    
        /**
         * Avvia il thread AstaDenier che rifiuterà le offerte in arrivo.
         */
        public void chiusuraOfferte() {
            denier = new AstaDenier(port);
            denier.start();
        }
    
        /**
         * Fa terminare anche il thread AstaDenier.
         */
        public void resetServer() {
            denier.reset();
        }
    
        /**
         * @return la lista delle offerte vincenti, ovvero con importo sul cavallo
         * passato come parametro
         */
        public String controllaOfferte() {
    
            LinkedList<Offerta> elenco = new LinkedList<Offerta>();
            Iterator iteratore = offerte.listIterator();
            
            return new String("Ha vinto matteo!");
        }
    
        public void login(){}
        
        
        /**
         * Invia a tutti i client in multicast l'elenco dei vincitori
         */
        public void comunicaVincitori(String OffertaVincente, InetAddress ind, int port) {
    
           
            try {
                MulticastSocket socket = new MulticastSocket();
                byte[] buf = new byte[256];
                String m = OffertaVincente;
              
                // Cryptography: begin
                // cripta con la chive privata i dati per inviarli allo
                // scommettitore
                buf = cipher.doFinal(m.getBytes());
                // Cryptography: end
    
                DatagramPacket pk = new DatagramPacket(buf, buf.length, ind, port);
                socket.send(pk);
            } catch (IOException ioe) {
                System.err.println(ioe);
            } catch (Exception e) {
                System.err.println(e);
            }
        }
        public void comunicaPrezzoCorrente(Inserzione ins, InetAddress ind, int port) {
    
            Double pa = ins.getPrezzoAttuale();
            try {
                MulticastSocket socket1 = new MulticastSocket();
                byte[] buf = new byte[256];
                String m = "" + pa;
                 // Cryptography: begin
                // cripta con la chive privata i dati per inviarli allo
                // scommettitore
                buf = cipher.doFinal(m.getBytes());
                // Cryptography: end
    
                DatagramPacket pk = new DatagramPacket(buf, buf.length, ind, port);
                socket1.send(pk);
            } catch (IOException ioe) {
                System.err.println(ioe);
            } catch (Exception e) {
                System.err.println(e);
            }
            
    }
        
        
        public static void main(String[] args) {
    
            int serverPort = 8001;
            int clientPort = 8002;
    
            // Cryptography: begin
            int getKeyServerPort = 8443;
            // Cryptography: end
    
            try {
                InetAddress multiAddress = InetAddress.getByName("230.0.0.1");
    
                Calendar deadline = Calendar.getInstance();
                deadline.add(Calendar.SECOND, 10);
    
                AstaServer server = new AstaServer(serverPort, getKeyServerPort, deadline);
                server.attendiChiusuraOfferte();
                server.chiusuraOfferte();
                String OffertaVincente=server.controllaOfferte();
                //metodo che calcola l'offerta maggiore.
                System.out.println("E' risultato vincitore l'offerente: " + OffertaVincente);
                 server.comunicaVincitori(OffertaVincente, multiAddress, clientPort);
                System.out.println("Vincitore:");
                System.out.println(OffertaVincente);
    
                Thread.sleep(150000);
                server.resetServer();
            } catch (InterruptedException ie) {
                System.err.println(ie);
            } catch (UnknownHostException uhe) {
                System.err.println(uhe);
            }
    
        }// main
    }// AstaServer

  5. #5
    qualcuno sa come aiutarmi?

  6. #6
    Non c'è nessuno che può darmi qualche consiglio?

    in pratica mi occorrerebbe sapere come posso implementare il fatto del login dell'utente client, se basta un solo socket per le comunicazioni tra server e client oppure ad ogni comunicazione diversa viene associato un socket diverso, per esempio per l'invio dell'elenco delle inserzioni da parte del server al client e per l'invio dei dati del login dal client al server o anche per l'invio dell'offerta relativa ad un inserzione...

    spero che c'è qualcuno che sa aiutarmi , trovandomi in seria difficoltà

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da InfoLuca
    Non c'è nessuno che può darmi qualche consiglio?

    in pratica mi occorrerebbe sapere come posso implementare il fatto del login dell'utente client, se basta un solo socket per le comunicazioni tra server e client oppure ad ogni comunicazione diversa viene associato un socket diverso, per esempio per l'invio dell'elenco delle inserzioni da parte del server al client e per l'invio dei dati del login dal client al server o anche per l'invio dell'offerta relativa ad un inserzione...

    spero che c'è qualcuno che sa aiutarmi , trovandomi in seria difficoltà
    Sono scelte implementative, fai conto che la comunicazione client/server è divisa in 3 fasi:

    1. stabilisci una connessione
    2. comunicazione
    3. chiudi connessione

    se devi continuare a comunicare, ti conservi le info sulla comunicazione e le riusi in un secondo momento (se non necessario salti l'overhead della connessione). Questo in genere lo fai quando ci si scambia di continuo messaggi.

    Se le richieste possono essere sporadiche, meglio crearsi sempre la connessione...a priori non c'è una soluzione migliore dell'altra.

    Per quanto riguarda la ricezione dei messaggi, fai conto che ogni client agisce anche da server, quindi sicuramente è un'app multithread
    RTFM Read That F*** Manual!!!

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.