App Client-Server

di il
5 risposte

App Client-Server

Salve a tutti ho iniziato a vedere come fare aplicazioni client server e mi sono imbattuto in questo esercizio:
Si definisca una applicazione client server basata su socket. Il server deve poter rispondere contemporaneamente a più client.
Il server genera un unico valore intero positivo N, da usare per ogni client che si collega.
Quando si connette, il client genera casualmente un intero M.
Il client invia poi al server M stringhe: “stringa1”, “stringa2”,… “stringaM”.
La trasmissione è terminata inviando la stringa “BYE”.
Ogni volta che un client termina la trasmissione, il server scrive a video il numero di stringhe di lunghezza N ricevute finora da tutti i client.

Questo è quanto sono riuscito a fare (sono ancora alle prime armi) , ammesso che ciò che ho scritto abbia un minimo di senso , non riesco a capire come inviare le stringhe dal client al server e nella classe che estende Thread come ottenere queste stringhe di cui confronterò la lunghezza con N.
vi lascio il codice , grazie in anticipo per chi mi risponderà!

package clientEsame;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClientEsame {

    public static void main(String[] args) {

        int M = (int) (Math.random() * 100) + 10;

        int intR;
        try (Socket server = new Socket("localhost", 3001);
                DataOutputStream out = new DataOutputStream(server.getOutputStream());) {
            Random r = new Random();
            for (int i = 0; i < M; i++) {
                
               //invio stringhe
               // out.writeInt(intR);
               // out.flush();
            }
            out.writeInt(0);//la trasmissione termina inviando la stringa bye
            out.flush();
        } catch (IOException ex) {
            Logger.getLogger(ClientEsame.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package serveresame;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Marco
 */
public class ServerEsame {
   
    
    private static final int PORTA=3001;
    static  int N = (int) (Math.random() * 100) + 10;
    /*
     * @param args the command line arguments
     */
     public static void main(String[] args) {
       
        
        ServerSocket server;
        
        try {
            server = new ServerSocket(9999);
            //System.out.println("Server creato, in attesa di un client");

            while (true) {

                //System.out.println("In attesa di un client");
                Socket s = server.accept();
                //System.out.println("Client collegato");

                ThreadEsame t = new ThreadEsame(s, N);
                t.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(ServerEsame.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}

        

   

package serverEsame;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ThreadEsame extends Thread {

    Socket client;
    Stringhe v;

    public ThreadEsame(Socket client, Stringhe v) {
        this.client = client;
        this.v = v;
    }

    @Override
    public void run() {

        int letto;
        try (DataInputStream in = new DataInputStream(client.getInputStream());) {

            while (   ) { //la lettura non termina finche non compare BYE
              //devo scrivere a video se il numero di stringhe di lungh N ricevute 
            }
            
        } catch (IOException ex) {
            Logger.getLogger(ThreadEsame.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (client != null) {
                try {
                    client.close();
                } catch (IOException ex) {
                    Logger.getLogger(ThreadEsame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

}


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package serveresame;


/**
 *
 * @author Marco
 */
public class Stringhe{

    private String s;
    
    public Stringhe(String s){
 
    this.s=s;
    int acc=0;
    
    
    if(ServerEsame.N== s.length()){
        
        acc++;
        System.out.println("Ci sono"+acc+"stringhe di lunghezza"+ServerEsame.N);
        }
}
    
   
 
    
    
    
    
    
}

5 Risposte

  • Re: App Client-Server

    Per lo scambio delle stringhe i DataInputStream/DataOutputStream hanno rispettivamente i metodi readUTF() e writeUTF() . Dal momento che c'è una stringa speciale di terminazione, il mittente non ha neanche bisogno di anticipare al destinatario il numero di stringhe. Il destinatario semplicemente continua a leggere fino a quella stringa speciale.

    Quella classe Stringhe invece è parecchio insensata/inutile.

    Potrò dire altro meglio domani con più tempo ..
  • Re: App Client-Server

    Grazie per i suggerimenti , ho cercato di "aggiustare" il codice ma nel momento della compilazione mi dà lo stesso errore ripetuto 2 volte : error: cannot find symbol ThreadEsame t = new ThreadEsame(s, N); .
    Credo basti qualche piccola modifica per il corretto funzionamento (almeno spero LOL).
    Questo è il codice "corretto" ma ancora non funzionante.
    package clientEsame;
    
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Random;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class ClientEsame {
    
        public static void main(String[] args) {
    
            int M = (int) (Math.random() * 100) + 10;
    
           
            try (Socket server = new Socket("localhost", 3001);
                    DataOutputStream out = new DataOutputStream(server.getOutputStream());) {
                Random r = new Random();
                PrintWriter out2= new PrintWriter(server.getOutputStream(),true);
                for (int i = 0; i < M; i++) {
                    
                    out2.println("stringa"+i);
               
                }
               out2.println("BYE");//la trasmissione termina inviando la stringa bye
               // out.flush();
            } catch (IOException ex) {
                Logger.getLogger(ClientEsame.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
    }
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package serveresame;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.InputStreamReader;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    
    /**
     *
     * @author Marco
     */
    public class ServerEsame {
       
        
        private static final int PORTA=3001;
        /**
         *
         */
        public static  int N = (int) (Math.random() * 100) + 10;
        /*
         * @param args the command line arguments
         */
         public static void main(String[] args) {
           
            
            ServerSocket server;
            
            try {
                server = new ServerSocket(3001);
                //System.out.println("Server creato, in attesa di un client");
    
                while (true) {
    
                    //System.out.println("In attesa di un client");
                    Socket s = server.accept();
                    //System.out.println("Client collegato");
    
                    ThreadEsame t = new ThreadEsame(s, N);
                    t.start();
                }
            } catch (IOException ex) {
                Logger.getLogger(ServerEsame.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
    
    }
    
            
    
       
    
    
    
    package serverEsame;
    
    import java.io.DataInputStream;
    import java.io.IOException;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import serveresame.ServerEsame;
    
    public class ThreadEsame extends Thread {
    
        Socket client;
        
    
        public ThreadEsame(Socket client) {
            this.client = client;
        }
    
        @Override
        public void run() {
    
            String letto;
            try (DataInputStream in = new DataInputStream(client.getInputStream());) {
    
                while( !"BYE".equals(letto=in.readLine()) ) { //la lettura non termina finche non compare BYE
               
                confronto(letto);
                }
                
            } catch (IOException ex) {
                Logger.getLogger(ThreadEsame.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                if (client != null) {
                    try {
                        client.close();
                    } catch (IOException ex) {
                        Logger.getLogger(ThreadEsame.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }
    
    
    public void confronto(String t){
        int acc=0;
        if(ServerEsame.N == t.length()){
            
            acc++;
            System.out.println("Ci sono"+acc+"stringhe di lunghezza"+ServerEsame.N);
            }
        
    }
    }
    
    
    
  • Re: App Client-Server

    Asimov999 ha scritto:


    mi dà lo stesso errore ripetuto 2 volte : error: cannot find symbol ThreadEsame t = new ThreadEsame(s, N); .
    Stai passando N, un numerico int. Mentre invece il costruttore di ThreadEsame:

    nella versione precedente era:
    public ThreadEsame(Socket client, Stringhe v)

    e ora nell'ultima versione è:
    public ThreadEsame(Socket client)

    Beh... è chiaro che new ThreadEsame(s, N) NON può corrispondere a nessuna delle due forme del costruttore che hai messo!!


    E inoltre:

    1) readLine() di DataInputStream è un metodo deprecato, NON deve essere più usato.

    2) Se vuoi mantenere il tuo protocollo di comunicazione "binario", allora la coppia DataInputStream/DataOutputStream è ok e puoi usare readUTF/writeUTF che ho già detto.
    Se vuoi fare invece un tuo protocollo di comunicazione "testuale" fatto a righe di testo, allora se da un lato usi PrintWriter, dall'altro lato dovresti usare BufferedReader, non DataInputStream.

    3) E quando usi stream di caratteri, specialmente su networking, in generale si deve sempre stabilire un charset ben preciso che sia comune tra client e server, tipicamente UTF-8 va bene.
  • Re: App Client-Server

    Grazie ho cercato di applicare i tuoi suggerimenti (almeno in parte), ora quando eseguo il server non mi compare nulla in output....
    Codice "ricocorretto"...
    package clientEsame;
    
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Random;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class ClientEsame {
    
        public static void main(String[] args) {
    
            int M = (int) (Math.random() * 100) + 10;
    
           
            try (Socket server = new Socket("localhost", 5000);
                    
                 PrintWriter out = new PrintWriter(server.getOutputStream(),true);) {
                
                for (int i = 0; i < M; i++) {
                    
                    out.println("stringa"+i);
               
                }
               out.println("BYE");//la trasmissione termina inviando la stringa bye
               out.flush();
            } catch (IOException ex) {
                Logger.getLogger(ClientEsame.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
    }
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package serveresame;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.InputStreamReader;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    
    /**
     *
     * @author Marco
     */
    public class ServerEsame {
       
        
        private static final int PORTA=5000;
        /**
         *
         */
        public static  int N = (int) (Math.random() * 100) + 10;
        /*
         * @param args the command line arguments
         */
         public static void main(String[] args) {
           
            
            ServerSocket server;
            
            try {
                server = new ServerSocket(5000);
                //System.out.println("Server creato, in attesa di un client");
    
                while (true) {
    
                    //System.out.println("In attesa di un client");
                    Socket s = server.accept();
                    //System.out.println("Client collegato");
    
                    ThreadEsame t = new ThreadEsame(s);
                    t.start();
                }
            } catch (IOException ex) {
                Logger.getLogger(ServerEsame.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
    
    }
    
            
    
       
    
    
    package serveresame;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class ThreadEsame extends Thread {
    
       private final Socket client;
      // private final int N;
        
    
        public ThreadEsame(Socket client) {
            this.client = client;
                 
        }
    
        @Override
        public void run() {
        
            
         try {
               BufferedReader in;
               in = new BufferedReader( new InputStreamReader(client.getInputStream()));
               BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
         
               String letto;
          
               while( !"BYE".equals(letto= stdIn.readLine()) ) { //la lettura non termina finche non compare BYE
                   confronto(letto);
               }
           } catch (IOException ex) {
               Logger.getLogger(ThreadEsame.class.getName()).log(Level.SEVERE, null, ex);
           }
            if (client != null) {
                try {
                    client.close();
                } catch (IOException ex) {
                    Logger.getLogger(ThreadEsame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
           }
        
    
    
    public void confronto(String t){
        int acc=0;
        if(ServerEsame.N == t.length()){
            
            acc++;
            System.out.println("Ci sono"+acc+"stringhe di lunghezza"+ServerEsame.N);
            }
        
    }
    
    }
    
    
    
    
    
    
  • Re: App Client-Server

    Asimov999 ha scritto:


    quando eseguo il server non mi compare nulla in output....
    
               BufferedReader in;
               in = new BufferedReader( new InputStreamReader(client.getInputStream()));
               BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
         
               String letto;
          
               while( !"BYE".equals(letto= stdIn.readLine()) ) { //la lettura non termina finche non compare BYE
    
    Sta leggendo da System.in ... non dal socket!!!
Devi accedere o registrarti per scrivere nel forum
5 risposte