Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7

    Domande su un codice java d'esempio... Chi sa rispondere?

    Ciao a tutta la comunity di Html.it
    Sono un nuovo iscritto del forum ma ho già avuto il piacere di utilizzare i mezzi e le informazioni messe a disposizione da html.it una miriade di volte. Mi complimento quindi con tutti per il servizio che state fornendo, a mio avviso il migliore in Italia!
    Srcivo in questa sezione in quanto mi servirebbe una mano per risolvere alcuni quesiti che mi sono trovato a dover risolvere durante una esercitazione e ai quali nono so dare una risposta.
    Se mi potreste dare una mano, motivando anche le vostre risposte, mi fareste un'enorme favore.
    Le domande sono relative a un programma in Java sviluppato ad hoc per l'esercitazione.

    Questa domanda si riferisce al codice della classe test definita nel file test.java.
    Come quando e da chi viene invocato il metodo hendle hevent


    1.dal programmatore e dall’utente ogniqualvolta le circostanze lo richiedano
    2.implicitamente dalla cpu del sistema che ospita l’emulatore della macchina virtuale java o all’inizio, meno frequentemente, al termine di ciascun ciclo di clock della cpu medesima
    3.implicitamente dal metodo init al termine dell’ esecuzione delle istruzioni che costituiscono il corpo del metodo init medesimo, così come redatte dall utente
    4.automaticamente dalla macchina java virtual machine al manifestarsi di un evento esterno ossia all’atto del cambiamento di stato di uno strumento di input in seguito al rilascio del tasto del mouse
    5.nessuna delle precedenti

    Questa domanda si riferisce al metodo run della classe span definita nel file test.java.
    Perché vengono create e avviate due istanze della classe smaz per ricopiare byte da una socket all’altra e viceversa invece di realizzare un unico ciclo all’interno del quale con 2 operazioni in sequenza si effettui dapprima la ricopiatura di un dato in una direzione, facendolo immediatamente seguire da un’operazione di copiatura di un dato nella direzione opposta?


    1.perché nel caso in cui i dati da ricopiare in una direzione fossero in quantità inferiore rispetto a quelli da ricopiare nella direzione opposta la comparsa del valore -1 nella prima direzione comporterebbe necessariamente l’uscita dal ciclo di copiatura inibendo così il completamento della copiatura nell’altra direzione
    2.perché altrimenti dovendosi compiere due operazioni di lettura e due operazioni di scrittura ad ogni ciclo, una per ciascuna direzione, verrebbero dimezzate le prestazioni del sistema di conseguenza la durata di tutte le note raddoppierebbe in fase di esecuzione rispetto a quella nativa calcolata all’origine in fase di composizione
    3.perché altrimenti la ricopiatura in una direzione risulterebbe maggiormente favorita rispetto alla ricopiatura nell’altra direzione, con il conseguente accumulo di ritardi crescenti per quest’ultima il che a lungo andare potrebbe comportare una fatale dissincronizzazione del dialogo tra client e server
    4.perché ci si potrebbe trovare in presenza di dati ricopiabili da una socket all’altra ma in assenza di dati da ricopiare in direzione opposta; la lettura della socket sul cui canale di uscita non sia per il momento presente in alcun dato avrebbe come effetto quello di bloccare temporaneamente l’esecuzione del programma in attesa che su quello stesso canale di uscita si manifesti la presenza di un qualche dato, questo blocco impedirebbe il passaggio dell’istruzione successiva e quindi alla copiatura nella direzione opposta di un dato eventualmente gia disponibile
    5.nessuna delle precedenti

    Questa domanda si riferisce all’invocazione di thread.sleep che compare nella classe play definita nel file test.java
    Perche il metodo sleep è definito come metodo static nella classe thread e non nella classe object?


    1.non è affatto vero che il metodo sleep sia definito nella classe thread esso è definito nella classe object ed è lecito invocarlo con riferimento alla classe thread come nell’esempio in esame, solo in quanto quest’ultimo è una sottoclasse della classe object dalla quale eredita quindi tutti i metodi sleep incluso
    2.perché altrimenti erroneamente potrebbe essere mandata in sleep anche la classe class capostipite di tutte le classi e quindi anche della classe object il sistema si bloccherebbe definitivamente senza alcuna possibilità di essere risvegliato
    3.perché in caso contrario il metodo sleep potrebbe essere correttamente invocato solo con object.sleep con il che verrebbero mandati a dormire non solo tutti i thread ma anche tutti gli altri oggetti presenti nella macchina virtuale java che esegue il codice di cui trattasi rendendo utilizzabile la cpu della java virtual machine medesima per tutta la durata dello sleep
    4.perche la funzionalità dello sleep è tipica dei thread in quanto programmi di esecuzioni e non degli object qualunque in quanto strutture dati passive e per le quali il concetto di sleep è privo quindi di senso.
    5.nessuna delle precedenti

    Questa domanda si riferisce al corpo del costrutto swich che compare nel codice della classe data definito nel file serv.java.
    Perché le due letture successive che compaiono in ciascuno dei due casi p=2 p=3 non sono state raggruppate in una sezione critica mediante un opportuno utilizzo del costrutto syncronized?


    1.perché la input stream da cui si legge non è una risorsa condivisa quindi non esiste alcun rischio che tra le due letture possa intromettersi qualche altro trhead a compromettere l’integrita della comunicazione con il client
    2.perché una volta entrati nel corpo del costrutto swich il primo punto in cui lo scheduler potrebbe sottrarre l’uso della cpu al trhead corrente si trova in corrispondenza dell’istruzione break e pertanto ciascuno dei casi che compongono il corpo dello swich è gia di fatto una sezione critica il che rende del tutto ridondante l’utilizzo del syncronized
    3.in realtà il mancato raggruppamento delle due letture in una sezione critica è un vero e proprio errore di programmazione che fortunatamente produce effetti devastanti solo occasionalmente e che quindi improbabile che possa inficiare il buon andamento della prova d’esame del corso infatti è possibile che un thread di qualche altro utente possa mettersi tra le due letture prelevando la seconda porzione del messaggio che il thread corrente sta attualmente leggendo compromettendo in tal modo l’integrità della comunicazione con il client
    4.perché in java il tipo di dato char viene rappresentato a 16bit ossia con 2 bit adiacenti e con le due letture successive di cui trattasi si vanno a leggere proprio i due byte che costituiscono la rappresentazione di un unico dato se anche quest’atro threadesi dovesse intromettersi tra le due letture esse ritornerebbe il valore null perche tra i dati byte in quanto adiacenti non ce proprio nulla da leggere e l’integrita della comunicazione con il client rimarrebbe comunque garantita
    5.nessuna delle precedenti

    questa domanda si riferisce all’inizializzazione delle variabili statiche host presenti sia nella classe test che nella classe span definite nel file test.java.
    quale delle seguenti configurazioni è compatibile con detta inizializzazione?


    1.esecuzione sulla macchina jli.dico.unimi.it sia di serv che di test come applicazioni via comando java e di esecuzione di test come applet via comando appletviewer su una macchina differente
    2.l’esecuzione sulla macchina jli.dico.unimi.it sia di serv come applicazione via comando java che di test come applet via comando appletwiver ed esecuzione di test come applicazione via comando java su una macchina differente
    3.l’esecuzione sulla macchina jli.dico.unimi.it di test come applicazione via comando java ed esecuzione su una macchina differente sia di serv come applicazione via cmando java che di test come applicazione via comando appletviwer
    4. l’esecuzione sulla macchina jli.dico.unimi.it sia di serv che di test come applicazioni via comando java ed esecuzione di test come applet via comando appletviwer sulla stessa macchina
    5.nessuna delle precedenti

    Questa domanda si riferisce all’invocazione new socket test.host test.port che compare nella classe play definita nel file test.java
    a quale funzione assolve questa invocazione


    1.alla creazione di una socket passiva che diventerà attiva solo nel momento in cui essa verrà automaticamente connessa alla corrispondente server socket al completamento dell’esecuzione del metodo accept riferito a quest’ultimo
    2.all’associazione del numero identificativo 12345 alla porta di nome jli.dico.unimi.it sulla macchina virtuale java che esegue la chiamata di new socket test.host test. port
    3.alla creazione di una socket e alla richiesta di sua connessione alla corrispondente server socket connessione che verrà definitivamente instaurata solo al completamento dell’esecuzione del metodo accept riferito alla server socket medesima
    4.alla creazione di una socket passiva che diventerà attiva solo nel momento in cui essa verrà connessa mediante l’esplicita invocazione di un opportuno metodo nel codice della classe play alla corrispondente server socket
    5.nessuna delle precedenti

    Questa domanda si riferisce alle variabili minalt e maxalt della classe test definite nel file test.java
    cosa accadrebbe se venisse eliminato il qualificatore static utilizzato per le suddette variabili?[/B]

    1.non accadrebbe assolutamente nulla di particolare, l’esecuzione procederebbe esattamente come se il qualificatore static non venisse rimosso rimarrebbero identiche le sue identiche strutture dati in memoria
    2.non accadrebbe assolutamente nulla di particolare, l’esecuzione procederebbe esattamente come se il qualificatore static non venisse rimosso solo le strutture di dati sarebbero leggermente differenti in quanto le variabili di cui trattasi non verrebbero incluse nella rappresentazione interna della classe test bensì nella rappresentazione interna di ciascuno degli oggetti esemplari di detta classe di mano in mano che vengano creati mediante la primitiva new
    3.verrebbe riscontrato un errore nella compilazione di tutte le classi in cui sono presenti le espressioni test minalt e test maxalt
    4.verrebbe riscontrato un errore nell’esecuzione di alcuni metodi definiti nelle classi note e play
    5.nessuna delle precedenti

    Questa domanda si riferisce al codice della classe test definita nel file test.java nella classe test estensione di classe applet si trovano definiti sia un metodo di nome min che un metodo di nome init
    Come vanno invocati questi metodi affinché il sistema funzioni correttamente?


    1.i due metodi possono essere utilizzati insieme o in alternativa a descrizione della macchina virtuale java
    2.i due metodi vanno necessariamente utilizzati insieme invocando il primo per il tramite del comando java attivato dal menu start di windows e il secondo per il tramite del comando appletviewer attivato in maniera analoga
    3.i due metodi vanno necessariamente invocati in alternativa perché la macchina virtuale java non può considerare una stessa classe simultaneamente come un’applicazione da invocare mediante il comando java e come un applet da invocare col comando appletviewer
    4.i due metodi possono essere utilizzati insieme o in alternativa a descrizione dell’utente
    5.nessuna delle risposte precedenti

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7

    Ecco il test.java

    codice:
    import java.awt.*;
    import java.util.*;
    import java.io.*;
    import java.net.*;
    import java.applet.Applet;
    import javax.sound.midi.*;
    
    //un thread esegue la applet
    //la quale parla con un passacarte(spam e smaz?)
    //il quale parla con il server
    //questa logica è dovuta a un misterioso baco malefico di java....
    
    public class Test extends Applet { // il client è un applet, viene chiamato da un file html
      final static String HOST = "localhost";
      final static int    PORT = 54321;
    
      static int MINALT = 128;
      static int MAXALT = 128;
      static int MINDUR = 128;
      static int MAXDUR = 128;
      static boolean ON = false;
    
      Scrollbar minaltSlider,
                maxaltSlider,
                mindurSlider,
                maxdurSlider;
      Button    playerButton;
    
      Synthesizer synt;
      Receiver    recv;
    
      public static void main (String args[]) {
    	try {
          ServerSocket w = new ServerSocket(Test.PORT);
          (new Span(w.accept())).start();
        } catch (Exception e) {
            System.out.println("Exception in Test: " + e);
            e.printStackTrace();
        }
      }
    
      public void init() {// è la funzione che fa avviare le applet
    
        setLayout(new BorderLayout(15,15)); //utilizza il secondo metodo costruttore della clase borderlayout, quello con in ingresso i margini ra un elemento e l'altro(in questo caso di 15x15)
    
        this.playerButton = new Button("Play");
        this.minaltSlider = new Scrollbar(Scrollbar.VERTICAL,   Test.MINALT, 1, 0, 128);
        this.maxaltSlider = new Scrollbar(Scrollbar.VERTICAL,   Test.MAXALT, 1, 0, 128);
        this.mindurSlider = new Scrollbar(Scrollbar.HORIZONTAL, Test.MINDUR, 1, 1, 101);
        this.maxdurSlider = new Scrollbar(Scrollbar.HORIZONTAL, Test.MAXDUR, 1, 1, 101);
        
        add("West",   this.minaltSlider);
        add("East",   this.maxaltSlider);
        add("North",  this.mindurSlider);
        add("South",  this.maxdurSlider);
        add("Center", this.playerButton);
    
        (new Play()).start();
      }
                                      //nell'evento creato possiamo avere: es, mouse clicca a coordinate x,y; handle event controlla circa 60 volte al secondo per ogni volta che il tasto del mouse è pigiato e ogni volta crea un evento.
      public boolean handleEvent(Event e) { //ad ogni evento relativo a un cambiamento delle condizioni delle unità di input come:clic,spostamento cursore, tasto digitato da tastiera ecc.. viene generato un evento di tipo handle event 
        
      if (e.target.equals(minaltSlider)) {// target permette di individuare la componente alle cordinate dove abbiamo cliccato, se era un bottone una scrollbar ecc. Se quello che abbiamo cliccato è il minaltslider...
          Test.MINALT = minaltSlider.getValue(); //metti nella var minalt il valore che segnala lo slider minalt
          System.out.println("minal"+Test.MINALT);
          if (Test.MINALT > Test.MAXALT) { //se minalt prova a superare maxalt
            Test.MAXALT = Test.MINALT; // poni il MINALt=a MAXALT
            maxaltSlider.setValue(Test.MAXALT);
          }// se il minimo sale oltre il valore attuale del massimo, fai salire anche il massimo
          return true;
        }
        if (e.target.equals(maxaltSlider)) {//se abbiamo cliccato lo slider di destra...
          Test.MAXALT = maxaltSlider.getValue();
          System.out.println("mxal"+Test.MAXALT);
          if (Test.MINALT > Test.MAXALT) {
            Test.MINALT = Test.MAXALT;
            minaltSlider.setValue(Test.MINALT);// se con il massimo scende si porta dietro il minimo
          }
          return true;
        }
        if (e.target.equals(mindurSlider)) {
          Test.MINDUR = mindurSlider.getValue();
          System.out.println("mndu"+Test.MINDUR);
          if (Test.MINDUR > Test.MAXDUR) {
            Test.MAXDUR = Test.MINDUR;
            maxdurSlider.setValue(Test.MAXDUR);
          }
          return true;
        }
        if (e.target.equals(maxdurSlider)) {
          Test.MAXDUR = maxdurSlider.getValue();
         System.out.println("mxdu"+Test.MAXDUR);
           if (Test.MINDUR > Test.MAXDUR) {
            Test.MINDUR = Test.MAXDUR;
            mindurSlider.setValue(Test.MINDUR);
          }
          return true;
        }
        return super.handleEvent(e);
      }
    
      public boolean action(Event e, Object arg) {//se cliccano sul bottone 
        if (!Test.ON) { //  e se on è false, quello diventa
    	  Test.ON = true; //quello diventa true
          ((Button)(e.target)).setLabel("Stop");
          return true;
        }
        if (Test.ON) {
          Test.ON = false;
          ((Button)(e.target)).setLabel("Play");
          return true;
        }
        return true;
      }
    }
    
    class Note {
      int alt;
      int dur;
    
      public Note(int alt, int dur) {
    	this.alt = alt;
    	this.dur = dur;
      }
      
      public void play(Receiver recv) {
        try {
          int timeStamp = -1;
          ShortMessage dn = new ShortMessage();
          ShortMessage up = new ShortMessage();
          dn.setMessage(ShortMessage.NOTE_ON,0,this.alt,127);
          up.setMessage(ShortMessage.NOTE_OFF,0,this.alt,127);
          System.out.println("Note = (" + this.alt + "," + this.dur + ")");
          recv.send(dn,timeStamp);
          Thread.sleep((int)(10*this.dur));
          recv.send(up,timeStamp);
        } catch (Exception e) {}
      }
    }
    
    class Play extends Thread {          //regola i messaggi che partono dal client al server
    
      public void run() {
        try {
    	  Synthesizer synt = MidiSystem.getSynthesizer();
          if (!synt.isOpen()) synt.open();
          Receiver    recv = synt.getReceiver();
          
          Socket sock = new Socket(Test.HOST, Test.PORT);
          InputStream  read = sock.getInputStream();
          OutputStream rite = sock.getOutputStream();
          
          boolean tempON     = Test.ON;
          int     tempMINALT = Test.MINALT;
          int     tempMAXALT = Test.MAXALT;
          int     tempMINDUR = Test.MINDUR;
          int     tempMAXDUR = Test.MAXDUR;
    
          System.out.println("Starting playing...");
          
          while (true) {
    	    Thread.sleep(10);
    	    if (tempON != Test.ON) {
    		    System.out.println("Transmitting ON/OFF");
    		    tempON = Test.ON;
    	        if (!Test.ON) rite.write(0); //PER IL BOTTONE ON VEDIAMO CHE IL CLIENT SCRIVE NEL CANALE 0,che nel server era codificato come on
    	        if (Test.ON) rite.write(1);// stessa osa per 1
            }
    	    while (Test.ON) {// se on è true fai continuamnte
    		  if (tempMINALT != Test.MINALT || tempMAXALT != Test.MAXALT) {
    			System.out.println("Transmitting MINALT/MAXALT");
    			tempMINALT = Test.MINALT;
    			tempMAXALT = Test.MAXALT;
    		    rite.write(2);        //se guardiamo nel server, nel case=2--> ri ricevono il minimo e il massimo di un intervallo
    	        rite.write(tempMINALT); //queste write sono in corrispondenza con le read che avevamo nel rever
    	        rite.write(tempMAXALT); //qui abbiamo delle variabili, ottenute da assegnamento, e poi scritte
              }  //possono essere quei messaggi che nel server si andavano a leggere
              if (tempMINDUR != Test.MINDUR || tempMAXDUR != Test.MAXDUR) {
    	        System.out.println("Transmitting MINDUR/MAXDUR");
    	        tempMINDUR = Test.MINDUR;
    	        tempMAXDUR = Test.MAXDUR;
    	        rite.write(3);
    	        rite.write(Test.MINDUR);
    	        rite.write(Test.MAXDUR);
              }
              int alt = read.read(); //dopo aver trasmesso guardiamo cosa il server ci trasmette: si tratta di un altezza e una durata con cui creare delle note
              //in sostanza: IL CLIENT modifica la applet tramite l'interaz dell'utente, manda le variazioni al server che calcola il valore casuale tra i valori provenienti dgli slider e rinvvia il tutto al client che con cuei valori fa le note.
              int dur = read.read();
    	      (new Note(alt, dur)).play(recv);
            }
          }
        } catch (Exception e) {
    	    System.out.println("Exception in Play: " + e);
    	}
      }
    }
     //DA QUI IN POI IL CODICE SI OCCUPA SOLO DI PASSARE IN INPU I DATI,POCO SIGNIFICATIVO PER CAPIRE IL SENSO DEL CODICE
    
    class Span extends Thread {
      final static String HOST = "localhost";  //è il nome della macchina su cui andremo a installare il server
      final static int    PORT = 12345;
    
      Socket loc;
      Socket rem;
    	
      public Span(Socket s) {
        try {
          this.loc = s;
          this.rem = new Socket(Span.HOST, Span.PORT);
        } catch (Exception e) {
            System.out.println("Exception in Span: " + e);
            e.printStackTrace();
        }
      }
      
      public void run() {
        try {
          (new Smaz(this.loc.getInputStream(), this.rem.getOutputStream())).start();
          System.out.println("Spanned Smaz1");//OGNI smaz legge e trasmette numeri
          (new Smaz(this.rem.getInputStream(), this.loc.getOutputStream())).start();
          System.out.println("Spanned Smaz2");
        } catch (Exception e) {
            System.out.println("Exception in Span: " + e);
            e.printStackTrace();
        }
      }
    }
    
    class Smaz extends Thread {
      InputStream  read;
      OutputStream rite;
    	
      public Smaz(InputStream r, OutputStream w) {
        this.read = r;
        this.rite = w;
      }
    	
      public void run() {
        try {
          int b;
          while ((b = this.read.read()) != -1) {
            this.rite.write(b);
          }
        } catch (Exception e) {
            System.out.println("Exception in Smaz: " + e);
            e.printStackTrace();
        }
      }
    }
    
    //TEMA D'ESAME:
    //CONSIDERANDO il centro: se con un cursore ho, al centro, il do 3, voglio che se il cursore di sinistra e 30 passi sotto
    //il do tre, quello di destra dev'essere 30 passi sopra. insomma deve muoversi specularmente.
    //ci sarà da lavorare (quasi) solamente: verrà chiesto di modificare l'interfaccia utente
    
    
                                     //nell'evento creato possiamo avere: es, mouse clicca a coordinate x,y
     /* public boolean handleEvent(Event e) { //ad ogni evento relativo a un cambiamento delle condizioni delle unità di input.clic,spostamento cursore, tasto digitato da tastiera ecc.. viene generato un evento di tipo handle event 
        if (e.target.equals(minaltSlider)) {// target permette di individuare la componente alle cordinate dove abbiamo cliccato, se era un bottone una scrollbar ecc. Se quello che abbiamo cliccato è il minalslider...
          Test.MINALT = minaltSlider.getValue(); //metti nella var minalt il valore che segnala lo slider minalt
          if (Test.MINALT > Test.MAXALT) { //se minalt prova a superare maxalt
            Test.MAXALT = Test.MINALT; // poni il MINALt=a MAXALT
            maxaltSlider.setValue(Test.MAXALT);
          }
          return true;
        }
        if (e.target.equals(maxaltSlider)) {//se abbiamo cliccato lo slider di destra...
          Test.MAXALT = maxaltSlider.getValue();
          if (Test.MINALT > Test.MAXALT) {
            Test.MINALT = Test.MAXALT;
            minaltSlider.setValue(Test.MINALT);
          }
          return true;
        }
        if (e.target.equals(mindurSlider)) {
          Test.MINDUR = mindurSlider.getValue();
          if (Test.MINDUR > Test.MAXDUR) {
            Test.MAXDUR = Test.MINDUR;
            maxdurSlider.setValue(Test.MAXDUR);
          }
          return true;
        }
        if (e.target.equals(maxdurSlider)) {
          Test.MAXDUR = maxdurSlider.getValue();
          if (Test.MINDUR > Test.MAXDUR) {
            Test.MINDUR = Test.MAXDUR;
            mindurSlider.setValue(Test.MINDUR);
          }
          return true;
        }
        return super.handleEvent(e);
      }
    */

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7

    Ecco il serv.java

    codice:
    import java.io.*;
    import java.net.*;
    
    class Serv {
      final static int    SECS = 1;
      final static int    PORT = 12345;
    
      public static void main (String args[]) {
        ServerSocket welcomeSocket = (ServerSocket)null;
        Socket       serviceSocket = (Socket)null;
    
        try {
          welcomeSocket = new ServerSocket(Serv.PORT);
          while (true) {
            serviceSocket = welcomeSocket.accept();//assegna una service socket ad ogni richiesta di connessione
            Fork serviceThread = new Fork(serviceSocket);
            serviceThread.start();
          }
        } catch(Exception e) { e.printStackTrace(); }
      }
    }
    
    class Fork extends Thread { //questo thread genera un server multithreading
      private Socket   sock;
    
      public Fork(Socket sock) { //
        this.sock = sock;
      }
    
      public void run() {
        try{          //probabilmente logs riguarda il loging dei comandi
          Logs         l = new Logs(this.sock);
    
          InputStream  i = this.sock.getInputStream(); //canale di input per le richieste dal client
          OutputStream o = this.sock.getOutputStream(); //can output
    
          Data d = new Data(i, l); // a questo thrad passiamo il canale di input, serve per mandare mess al client
          Comp c = new Comp(o, l); // a questo thread passiamo il can di output, gestisce la com di ritorno dal client
                 //sia data che comp hanno in ingresso l,logs, perciò lasceranno traccia del loro operato in qualche modo
          d.comp = c; // è la maniera per far conoscere al thread d chi è il thread c
          
          
          c.data = d; //viceversa; i due thread dovranno probabilmente cooperare tra loro, qusta è la loro presentazione
       //crea la musica è li invia al client
          d.start();
          c.start();
    
        } catch (Exception e) { e.printStackTrace(); }
      }
    }
    
    class Comp extends Thread {//immette nel canale di output delle note ottenute da un calcolo casuale basato sul i valori
      OutputStream chan;   //di data, il canale di inputstream.
      Logs         logs;
      Data         data;
    
      public Comp(OutputStream chan, Logs logs) {
        this.chan = chan;
        this.logs = logs;
      }
    
      public void run() {
    	  
        this.logs.log("Comp started");
        try {
          while (true) {
            while (this.data.isOn()) { // quando isOn + true
              int alt[] = this.data.getAlt();//getalt e getdut restituiscono un array di valori, per le alt e dur: il min e il max valore
              int dur[] = this.data.getDur();
              Note note = new Note(alt[0], alt[1], dur[0], dur[1]);
              note.xmit(this.chan); //stampa i valori delle note ottenute da random tra val min e max.In ingresso ha una variabile di output
              this.logs.log("Note " + Note.qty +
    	                    " = ("+ note.alt + "," + note.dur + ")");
            }
            yield();// da CERCARE SUL MANUALE appartiene alla classe thread visto che siamo nella classe therad e non è estensione di nient'altro
          } //yield---> fa uscire il therad corrente dalla cpu(se un processo ne ha più bisogno lui cede il posto)
        } catch (Exception e) {
            this.logs.log("Exiting - Connection reset");
    	this.stop();
        }
      }
    }
    
    class Note {
      static int qty = 0;
      int alt;
      int dur;
    
      public Note(int minalt, int maxalt, int mindur, int maxdur) {
        Note.qty++; // dopo incrementa la quantità, è una variabile static, perchè viene invocata da nota.blabla
        alt = minalt + (int)(Math.random()*(maxalt - minalt));
        dur = mindur + (int)(Math.random()*(maxdur - mindur));
      }
      
      public void xmit(OutputStream o) throws Exception {
          o.write((int)this.alt);
          o.write((int)this.dur);
          Thread.sleep(10*this.dur);
      }
    }
    
    class Data extends Thread {
      InputStream chan;
      Logs        logs;
      Comp        comp;
    
      int MINALT = 36;// il range delle altezze è di 4 ottave
      int MAXALT = 84;
      int MINDUR = 25;
      int MAXDUR = 75;
      boolean ON = false; //sembra essere un interruttore, inizialmente è spento
    
      private int minalt;//possono essere variabili temporanee cn cui modificare il valore degli omonimi
      private int maxalt;
      private int mindur;
      private int maxdur;
    
      public Data(InputStream chan, Logs logs) {
        this.chan = chan;
        this.logs = logs;
      }
    
      public void run() {
        this.logs.log("Data started");
        try {
          int b;  // il primo byte è un comando, il 2° pure,
          while ((b=this.chan.read()) != -1) {//fintantochè la read non legge -1, ovvero finchè è diverso da -1, che è l'end of file(del canale di input).
          this.logs.log("Command = " + b);
            switch (b) {// b è il valore che leggiamo dalla read
              case 0: setOff(); //se leggiamo ,dalla read, 0, facciamo un set off, spegnamo il dispositivo
    	              this.logs.log("Stopped @ note: " + Note.qty);
                      break;
              case 1: setOn();//se leggiamo ,dalla read, 1, facciamo un set on, accendiamo il dispositivo
    	              this.logs.log("Resumed @ note: " + Note.qty);
                      break;
              case 2: minalt = this.chan.read();//vengono innizializzate con i valori ricevuti, ma sono lo stesso valore per max e min?
                      maxalt = this.chan.read();
    		          if (minalt <= maxalt) setAlt();//questa if serve per controllare che il client non invii un valore minimo + grande del corrispettivo val massimo
    	              this.logs.log("Pitch   = [" + MINALT + "," + MAXALT + "]");
                      break;
              case 3: mindur = this.chan.read();
                      maxdur = this.chan.read();
    		          if (mindur <= maxdur) setDur();
    	              this.logs.log("Rythm   = [" + MINDUR + "," + MAXDUR + "]");
                      break;
            }
          }
        } catch (Exception e) {
            this.logs.log("Exiting - Connection reset");
    	    setOn();
    	    this.stop();
        }
      }
    
      synchronized void setOn() {
        ON = true; // set on manda in true l'interruttore
        notify();
      }
    
      synchronized void setOff() { //set of lo manda in false
        ON = false;
        notify();
      }
    
      synchronized boolean isOn() {
        while (!ON) try {wait();} catch (Exception e) {}; // quando on è falso lo manda in wait
        //quando l'interruttore è acceso, aspetta
        return ON;
      }
    
      synchronized void setAlt() {
        MINALT = minalt; // le variabili temporanee travasano il loro valore nei campi dell'oggetto di classe
        MAXALT = maxalt;
      }
    
      synchronized int[] getAlt() { //scrive in un array lungo 2 elem,da0 a 1, i valori MINAL E MAXALT, definiti nella classe data
        int alt[] = new int[2];
        alt[0] = MINALT; // minalt è il primo elemento dell'array
        alt[1] = MAXALT; //tra i 
        return alt;
      }
    
      synchronized void setDur() {
        MINDUR = mindur;
        MAXDUR = maxdur;
      }
    
      synchronized int[] getDur() {
        int dur[] = new int[2];
        dur[0] = MINDUR;
        dur[1] = MAXDUR;
        return dur;
      }
    }
    
    // La classe che segue serve solo per creare e gestire il file di log.
    // L'unico metodo di cui e' utile conoscere il funzionamento e' "log".
    class Logs {
      final static String PATH = "/home/gfp/Logs/ProMus/Logs-20-07-07/Tur1/";
      final static String LOGS = "logs";
    
      private Socket   sock; // è la socket che parla con il client
      DataOutputStream logs;
    
      public Logs(Socket sock) {
        this.sock = sock;
        InetAddress addr = this.sock.getInetAddress(); //prendiamo l'indirizzo del client
        int         port = this.sock.getPort();
        String      name = addr.getHostName();
        String      ipv4 = addr.getHostAddress();//prendiamo l'ip del client
    
        new File(Logs.PATH + ipv4).mkdir(); //creiamo una nuova directory con il nome passato come parametro di File(nome)
        try {
          this.logs =                    //java ha implementate 40classi che riguardano file, per i vari scopi cui possono servire.
            new DataOutputStream(
              new FileOutputStream( // poi lo trasforiamo in un file di outputstream
                new File(Logs.PATH + ipv4 , Logs.LOGS), true));
        } catch (FileNotFoundException e) {
    	    System.out.println("No log file created: " + name + "[" + ipv4 + "]");
            e.printStackTrace();
    	return;
        }
        log("****************************");
        log("Client Name = " + name);
        log("Client Addr = " + ipv4);
        log("Client Port = " + port);
      }
    
      synchronized void log(String mess) {
        String name = Thread.currentThread().getName(); //prende il nome del thread corrente e scrive un messaggio nel file di log
        try {
          this.logs.writeBytes(name + " - " + mess + "\n"); 
          //la trasformazione di questi file in tipo outputstrem è dovuta forse, dal fatto che per comodità usiamo il metodo writebyte
        } catch (IOException e) { e.printStackTrace(); }
    
      }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7
    Allora, che ne dite? vi ringrazio già adesso... :-)

  5. #5
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    fa un favore.. leggi il regolamento del forum. C'è un punto importante in cui viene chiesto di usare i tag [ code][/ code] o [ php][/ php]

    Non dimenticarti neppure di indentare per bene il codice. A presto.
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7
    Originariamente inviato da Pastore12
    fa un favore.. leggi il regolamento del forum. C'è un punto importante in cui viene chiesto di usare i tag [ code][/ code] o [ php][/ php]

    Non dimenticarti neppure di indentare per bene il codice. A presto.
    Così può andare? Ps: grazie per il suggerimento.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7

    Nessuno sa dirmi niente?

    Non c'è nessuno che sa darmi una mano?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    C'è anche un'altra cosa: qui si discute di problemi di programmazione.
    La risoluzione di esercizi/test non è ammessa.
    Come non è possibile affrontare in una discussione di un forum, un'intera paginata di domande di un esercizio/test/esame.

    Nel forum si posta del codice che non funziona o per il quale si hanno dei dubbi e si cerca di risolvere il problema o il dubbio... ma chiedere di rispondere a 7 domande diverse di un quiz non è generalmente concesso.


    Devo, quindi, chiudere.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    7

    ok grazie comunque

    ok grazie comunque

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.