Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 52
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    28

    [JAVA] Server deve leggere da un file di testo ogni tot di tempo

    Ciao a tutti!
    Sto sviluppando questo programma che consiste in una semplice social network che implementa la possibilità di partecipare a dei quiz ma in maniera molto semplice.
    Mi spiego meglio:
    - Il server estrae in modo casuale una domanda da una lista di domande/
    risposte memorizzate su un file e determina la data di scadenza.
    - Le domande sono create in modo sequenziale e distanti una dall’altra 2 minuti e valgono per tutti gli utenti iscritti.
    - Ogni due minuti, il server quindi somministra un nuovo quiz con data di scadenza
    ds = dc + t dove dc è la data di creazione e t è un intero (numero di minuti) che viene passato come argomento alla classe che modella il server. Per esempio se il server viene creato alle ore 9:00 mediante:
    java server 3
    il primo quiz viene creato alle ore 9:02 e termina alle ore 9:05, il secondo inizierà alle ore 9:04 e terminerà alle ore 9:07, etc ...

    A questo punto gli utenti che fanno il login hanno la possibilità di vedere le domande disponibili e rispondere e se la risposta è corretta gli viene assegnato un punto, tutto qui, non c'è concorrenza nè chi arriva prima, semplicemente alla data di scadenza della domanda il server assegna un punto a tutti coloro che hanno risposto correttamente.

    Premettendo che ho già realizzato tutta la parte di social networking usando graphstream per gestire gli utenti e gli amici ecc e che tutto funziona, il mio blocco arriva proprio al punto di gestire le domande perchè non so proprio da dove inziare:
    suppongo che il server debba estrarre una domanda ogni due minuti random da un file(immagino txt vada bene) e inserirla in un "contenitore" diciamo(array?collection?), il cui contenuto verrà letto dall'utente quando invierà la reativa richiesta. Nel frattempo questo contenitore deve aggiornarsi perchè le domande hanno un id e una scadenza quindi se poteste indirizzarmi sulla strada giusta per gestire tutto questo ve ne sarei molto grato! Scusate la lungaggine ma volevo essere il più chiaro possibile e grazie in anticipo!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    Se il tuo problema è solo su come salvare i dati, puoi seguire diverse strade:
    - abbandonare l'idea del file txt, salvare tutto in un database, e pace all'anima sua
    - tenere il file txt, quando leggi la domanda, cacci domanda e dati vari in una classe apposita(segui struttura beans e non dovresti aver problemi), poi aggiorni il tutto quando ti serve. ogni beans potresti metterlo in un qualche tipo di lista. il problema di questa soluzione è che, se il server va giù, perdi tutto. per evitare questo ti converrebbe usare un database.

    Se il tuo problema è come temporizzare il tutto, puoi usare la versione base di java, oppure sfruttare qualche classe già fatta da altri. Tempo addietro ne trovai una ma, non avendone mai avuto bisogno, ora mi sfugge completamente.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    28
    grazie dei suggerimenti ma non ho ben capito...
    Database non devo usarne, deve essere una cosa molto semplice,
    io ho già server e client fatti e funzionanti con la gestione del social network, quello che devo aggiungere è del codice nel server che gestisca le domande temporalmente con le caratteristiche che ho specificato prima.
    E' quindi una qualche dritta su che codice potrebbe fare al caso mio che mi servirebbe!
    Grazie ancora!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    Quella del database era una delle tante possibilità.
    Tenendo il file di testo, puoi leggere il file quando ti serve, cacciare tutto in un ArrayList(giusto per non star li a ridimensionare l'array a mano), pescare la domanda che ti serve, si imposta quando scade la domanda(di modo da andare ad aggiornarla quando avrà bisogno), salva quindi la domanda in una qualche variabile in una qualche classe che dovrà gestire le domande.
    Quando un utente deve vedere la domanda, va sulla sua bellissima paginetta, che, da lato server, entra nell'oggetto con la domanda salvata e la stampa all'utente.

    è una soluzione piuttosto semplice, e che col tempo tenderà ad incasinare tutto, ma se vuoi una gestione base questo è tutto quel che ti serve.

    Tutto questo prevede che l'utente veda una sola domanda ogni due minuti. Se vuoi fare cose diverse, basta che invece di salvare nella classe solo la stringa, ci salvi la lista.
    Se oltre alla domanda vuoi mantenere anche altre informazioni, basta che fai una lista di oggetti complessi, invece che di sole stringhe, in cui salvi id, data, domanda, etc.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    28
    Grazie di tutti i consigli vedrò di metterli in pratica facendo qualche prova, nel frattempo per temporizzare il tutto ho visto che ci sono timer e timertask dici che fanno al caso mio?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    La soluzione più semplice sarebbe creare un thread con dentro un timer, e usare questo per fare tutti gli aggiornamenti.

    Esistono soluzioni più avanzate, ma non posso aiutarti in questo.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    28
    Ciao di nuovo!
    Dopo vari tentativi sono arrivato a questo:

    codice:
    public static class MyThread extends java.util.TimerTask { 
    		   
    		  public void run() { 
    		  // Contiene il processo da eseguire in background 
    		   
    		   // GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+2")); 
    		    try {            
                    BufferedReader input = new BufferedReader(new FileReader("domande.txt"));
                    ArrayList<String[]> quiz = new ArrayList<String[]> ();
                    String[][] mappa = new String[0][] ;
                    String text; 
                    //Integer x = 0, y = 0;
                    while ((text = input.readLine()) != null)
                         quiz.add(text.split(";"));
                         UUID id = UUID.randomUUID();
                         domandaId = id.toString();
                    Collections.shuffle(quiz);
                    mappa = quiz.toArray(mappa);
                   
                    int x = (int)Math.random() * 4;
                    //int y = (int)Math.random() ;
                    
                    q = mappa[x][0];
                    
                    dataChiusura = minute + 3;
                    
                    r = mappa[x][1];
                    input.close();
                    System.out.printf("Domanda disponibile:" + q + "\n" + "ID:" + domandaId + "\n\n");
                    System.out.printf("Risposta corretta:" + r + "\n" + "ID:" + domandaId + "\n\n");
                    
                	} catch (IOException ioException) {
                }        
    		  } // run() 
    	
    	}
    	
    	public static void main(String[] args) throws ElementNotFoundException, GraphParseException
    	{		
    		MyThread mt = new MyThread(); 
    	    java.util.Timer timer = new java.util.Timer(); 
    	    timer.schedule(mt,0,120000);
    	    
    	    int j = 60000;
    	    // Qui c'è il codice dell'applicazione principale 
    	    for (int i=0; i<j; i++) { 
    	    	j = j + 10000;
    	    	new Server();
    	    } 
    		
    	}

    Poi c'è il metodo getQuiz richiamabile dall'utente che stampa a console l'id della domanda, la domanda stessa e la data di scadenza.

    Il codice che ho postato praticamente mi estrae ogni due minuti una domanda random dal file come volevo però queste vengono sovrascritte, quindi ogni due minuti mi viene sottoposta una nuova domanda, quello che invece devo fare è che le domande siano tutte disponibili finchè non scadono, quindi devo trovare il modo di salvarle tutte in un qualche contenitore e applicare un controllo che in caso dataScadenza sia uguale a orario attuale(ore e minuti) elimini la domanda da quelle disponibili ma fin ora non sono riuscito ad ottenere niente...qualcuno vedendo il mio codice saprebbe darmi una mano? Grazie!

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    Non ho capito qual'è il problema.
    Guardando il codice, non ho neanche capito perché l'hai fatto così complesso.

    ArrayList<Domanda> domande = new ArrayList<Domanda>();
    #apri il file delle domande, le leggi tutte e cacci quello che ti serve nella lista
    #a questo punto, hai un elenco di domande, anche se poi ne mostrerai solo una, e qui non capisco a che ti serva l'elenco, a meno che tu questa cosa non la faccia solo una volta, per poi avere tutte le domande sempre disponibili

    Domanda domandaCorrente = domande.get((int)(Math.rand()*domande.size());

    #e a questo punto gestisci come ti pare la cosa.

    codice:
    	class Domanda{
    		protected int id;
    		protected String domanda;
    		protected String rispostaEsatta;
    		protected Date dataScadenza
    		
    		//get e set vari
    	}
    Vedi se come cosa può andare.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    28
    Non ho ancora provato, ma per risponderti velocemente io devo fare in modo di avere più domande disponibili contemporaneamente perchè all'inizio ne tira fuori una che magari ad esempio scade fra 3 minuti, ma dopo 2 minuti il server in automatico ne tira fuori un altra quindi in quel minuto, di domande disponibili ce ne sono due e le deve visualizzare entrambe all'utente che invoca la richiesta.
    Scusa se magari dico cose ovvie o mi complico la vita, ma è praticamente il mio primo programma java vero e proprio quindi per me niente è scontato!
    E grazie ancora per la tua disponibilità!

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    Allora ogni due minuti prendi la lista, iteri su tutti gli elementi, eliminando quelli che sono scaduti
    codice:
    for (int i=0; i<quiz.size(); i++)
        if (quiz(i).time<now) quiz.remove(i);
    quindi aggiungi a questa lista la nuova domanda.

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.