lpr-a:progetto4
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisioneRevisione precedente | |||
lpr-a:progetto4 [14/12/2010 alle 13:05 (14 anni fa)] – Vincenzo Gervasi | lpr-a:progetto4 [14/12/2010 alle 13:38 (14 anni fa)] (versione attuale) – Vincenzo Gervasi | ||
---|---|---|---|
Linea 11: | Linea 11: | ||
===== Ciclo di funzionamento ===== | ===== Ciclo di funzionamento ===== | ||
- | Ogni utente del juke-bok è dotato di un programma, che normalmente funge da client, ma occasionalmente può fungere anche da server. Al programma viene fornito, come parametro di riga di comando, l' | + | Ogni utente del juke-bok è dotato di un programma, che normalmente funge da client, ma occasionalmente può fungere anche da server. Al programma viene fornito, come parametro di riga di comando, l' |
All' | All' | ||
- | Una volta stabilito il contatto con il server, il client invia la lista della musica che ha a disposizione, | + | Una volta stabilito il contatto con il server, il client invia la lista della musica che ha a disposizione, letta dalla directory indicata, attraverso una serie di messaggi **disponibile**. |
Dopo aver trasmesso la lista al server, il client si pone in attesa di ricevere dal server un comando **play**, che contiene l' | Dopo aver trasmesso la lista al server, il client si pone in attesa di ricevere dal server un comando **play**, che contiene l' | ||
Linea 111: | Linea 111: | ||
===== Accesso all' | ===== Accesso all' | ||
+ | La classe principale per l' | ||
<code java> | <code java> | ||
+ | // Crea: | ||
+ | // un AudioInputStream (in questo caso da un file, ma esiste una variante overloaded che legge i dati audio da un InputStream qualunque), | ||
+ | // un AudioFormat che rappresenta il formato dei dati audio dell' | ||
+ | // una SourceDataLine che rappresenta un canale di output audio pronto a riprodurre dati nell' | ||
+ | |||
File f = new File("/ | File f = new File("/ | ||
AudioInputStream ais=AudioSystem.getAudioInputStream(f); | AudioInputStream ais=AudioSystem.getAudioInputStream(f); | ||
AudioFormat af=ais.getFormat(); | AudioFormat af=ais.getFormat(); | ||
SourceDataLine sdl=AudioSystem.getSourceDataLine(af); | SourceDataLine sdl=AudioSystem.getSourceDataLine(af); | ||
+ | |||
+ | // Inizializza un buffer di dimensione adeguata a contenere un secondo di audio | ||
+ | |||
int bufsize=(int) (af.getSampleRate()*af.getFrameSize()); | int bufsize=(int) (af.getSampleRate()*af.getFrameSize()); | ||
byte[] buffer = new byte[bufsize]; | byte[] buffer = new byte[bufsize]; | ||
+ | |||
+ | // Apre il canale audio e imposta il volume master al massimo | ||
+ | |||
sdl.open(af); | sdl.open(af); | ||
if( sdl.isControlSupported( FloatControl.Type.MASTER_GAIN ) ) { | if( sdl.isControlSupported( FloatControl.Type.MASTER_GAIN ) ) { | ||
Linea 124: | Linea 136: | ||
| | ||
} | } | ||
+ | |||
+ | // Avvia la riproduzione dell' | ||
sdl.start(); | sdl.start(); | ||
+ | |||
+ | // Legge, a blocchi, i dati dall' | ||
+ | |||
int l=1; | int l=1; | ||
while (l>=0) { | while (l>=0) { | ||
Linea 131: | Linea 148: | ||
if (l>=0) sdl.write(buffer, | if (l>=0) sdl.write(buffer, | ||
} | } | ||
+ | |||
+ | // Aspetta che sia terminata la riproduzione dell' | ||
+ | |||
sdl.drain(); | sdl.drain(); | ||
sdl.stop(); | sdl.stop(); | ||
Linea 136: | Linea 156: | ||
</ | </ | ||
+ | Il sottosistema audio di Java è estendibile tramite plug-in per supportare la riproduzione di formati qualunque, ma non sempre sono disponibili i plug-in giusti. Si raccomanda di utilizzare per le prove dei file in formato [[http:// | ||
- | + | estra). | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | VECCHIO PROGETTO: | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | Client e server comunicano tramite un unico canale tramite TCP. Tutte le comunicazioni sono iniziate dal client. | + | |
- | + | ||
- | ==== Convenzioni generali ==== | + | |
- | === Formato === | + | |
- | Il protocollo di comunicazione è basato sullo scambio di comandi e risposte di un singolo byte; alcuni comandi considerano il byte suddiviso in campi di bit, a cui sono assegnati specifici significati; | + | |
- | + | ||
- | === Temporizzazione === | + | |
- | Ciascun cliente **deve** inviare almeno un messaggio ogni 5 secondi (altrimenti viene dichiarato //morto di sonno// e chiuso). Per prevenire lo spamming, il server **ignora** ogni messaggio che sia ricevuto dopo meno di 50ms dal messaggio precedente dello stesso client. È comunque possibile inviare poi in seguito altri messaggi, sempre rispettando i vincoli temporali di cui sopra. Si noti che se un messaggio ignorato prevedeva una risposta, la risposta non verrà inviata: è quindi opportuno assicurarsi di non inviare messaggi troppo ravvicinati, | + | |
- | + | ||
- | === Fairness === | + | |
- | Tentativi di sabotare il server o il protocollo sono lodevoli, ma considerati illegali ai fini dell' | + | |
- | ==== Messaggi TCP ==== | + | |
- | I comandi hanno la seguente struttura: | + | |
- | * bit 7-6: riservati per future espansioni | + | |
- | * bit 5-2: opcode di comando | + | |
- | * bit 1-0: codice di direzione | + | |
- | + | ||
- | === Comandi === | + | |
- | ^ Comando ^^ Descrizione ^ Risposta ^ Consumo energia ^ | + | |
- | ^ Nome ^ Valore ^ ^ ^ ^ | + | |
- | | Comandi con codice di direzione ||||| | + | |
- | ^ STEP ^ 1 | Si sposta di un passo verso la // | + | |
- | ^ LOOK ^ 2 | Guarda verso la // | + | |
- | ^ FIRE ^ 3 | Emette un raggio laser lungo la // | + | |
- | | Comandi senza codice di direzione ||||| | + | |
- | ^ GPS ^ 5 | Restituisce la propria posizione corrente. | Un byte contenente la posizione //x//, un byte contenente la posizione //y//. | - | | + | |
- | ^ BATTERY ^ 6 | Restituisce la carica corrente della batteria. | Un byte contenente la carica corrente; 255=massima, | + | |
- | ^ SCORE ^ 7 | Restituisce il punteggio corrente. | Un byte contenente il punteggio corrente. | - | | + | |
- | ^ TELEPORT ^ 8 | Teletrasporta il robot in un punto casuale della mappa. | - | 10 unità | | + | |
- | ^ REGISTER ^ 9 | Registra il client sul server; questo comando deve essere inviato prima di ogni altro comando, e il byte di comando deve essere seguito da una stringa ASCII NUL-terminated contenente il nome del robot, che deve essere unico. Il comando è illegale se inviato successivamente alla prima registrazione. | Un byte ACK se la registrazione è stata accettata, o NAK se è stata rifiutata. | - | | + | |
- | + | ||
- | Per il comando GPS, il sistema di coordinate utilizzato è quello consueto (in Informatica), | + | |
- | + | ||
- | === Altre costanti === | + | |
- | ^ Costante ^ Valore numerico ^ Descrizione ^ | + | |
- | |Direzioni||| | + | |
- | ^ N ^ 0 | nord (verso l' | + | |
- | ^ E ^ 1 | est (verso destra) | | + | |
- | ^ S ^ 2 | sud (verso il basso) | | + | |
- | ^ W ^ 3 | ovest (verso sinistra) | | + | |
- | |Codici di conferma||| | + | |
- | ^ ACK ^ 1 | conferma; vero; esito positivo | | + | |
- | ^ NAK ^ 0 | diniego; falso; esito negativo | | + | |
- | |Oggetti di mappa||| | + | |
- | ^ ROBOT ^ 82 | un robot | | + | |
- | ^ WALL ^ 88 | un muro interno | | + | |
- | ^ OUTSIDE ^ 0 | fuori mappa (un muro esterno) | | + | |
- | + | ||
- | ==== Gestione della batteria ==== | + | |
- | Se il robot non dispone di energia sufficiente a eseguire un comando, l' | + | |
- | + | ||
- | ==== Comunicazioni intra-client ==== | + | |
- | Il protocollo, i formati, e il tipo di comunicazione (tipicamente: | + | |
- | + | ||
- | ==== Trattamento degli errori e terminazione ==== | + | |
- | Se il server riconosce un errore nel comportamento del client, la comunicazione viene interrotta (il giocatore rimane registrato ma viene " | + | |
- | Il timeout di una comunicazione è considerato un errore, così come l' | + | |
- | Il gioco non prevede la possibilità di de-registrare un giocatore, né un esplicito "fine partita"; | + | |
===== Requisiti generali e modalità di consegna ===== | ===== Requisiti generali e modalità di consegna ===== | ||
Ogni studente che vuole sostenere l' | Ogni studente che vuole sostenere l' | ||
- | progetto svolto al docente | + | progetto svolto al docente |
Il progetto deve essere sottomesso individualmente, | Il progetto deve essere sottomesso individualmente, | ||
svolto da un gruppo di due studenti al massimo: in questo caso nel | svolto da un gruppo di due studenti al massimo: in questo caso nel | ||
Linea 225: | Linea 172: | ||
Per poter essere valutato, il codice del client sviluppato nel progetto deve essere in grado di | Per poter essere valutato, il codice del client sviluppato nel progetto deve essere in grado di | ||
- | interagire senza errori con il server | + | interagire senza errori con altri client e server (che rispettino il protocollo indicato sopra). |
- | macchine del CLI, dove verrà testato. | + | |
Il codice del progetto deve essere ben commentato e deve essere accompagnato da una relazione | Il codice del progetto deve essere ben commentato e deve essere accompagnato da una relazione | ||
- | di 3-5 pagine che descrive l' | + | di 3-5 pagine che descrive l' |
- | del singolo client e per la collaborazione tra più client, e le politiche di sincronizzazione tra thread | + | |
- | utilizzate. Inoltre occorre produrre un breve manuale d'uso che descrive i comandi necessari per | + | |
- | avviare le varie istanze del client, sia su uno stesso host che su host diversi. | + | |
Codice, relazione e manuale d'uso devono essere inviati per posta elettronica al docente del | Codice, relazione e manuale d'uso devono essere inviati per posta elettronica al docente del | ||
- | corso **entro | + | corso **entro |
verranno ammessi, e lo studente dovrà svolgere un nuovo progetto che verrà pubblicato successivamente. | verranno ammessi, e lo studente dovrà svolgere un nuovo progetto che verrà pubblicato successivamente. | ||
I progetti sottomessi verranno testati durante un evento pubblico; i dettagli verranno forniti in seguito. | I progetti sottomessi verranno testati durante un evento pubblico; i dettagli verranno forniti in seguito. | ||
- | ===== Suggerimenti finali ===== | ||
- | |||
- | L' | ||
- | * la correttezza dell' | ||
- | * il design e l' | ||
- | * l' | ||
- | * la qualità complessiva di scrittura del codice e della relazione. | ||
- | Nella parte orale verranno invece verificate le conoscenze teoriche su tutti gli argomenti trattati nel corso. | ||
- | |||
- | Si raccomanda di verificare in anticipo il funzionamento dei client sulle macchine del Centro di Calcolo (Laboratori H-Lab e M-Lab), su cui verrà svolto il " | ||
- | |||
- | Per lanciare più istanze del client in maniera rapida, si può usare un comando di shell di questo tipo: | ||
- | |||
- | '' | ||
- | o un suo equivalente su altri sistemi operativi. | ||
===== FAQ ===== | ===== FAQ ===== | ||
- | **Come è definita una " | ||
- | \\ | ||
- | Non esiste sul server il concetto di squadra; dal punto di vista del server, si tratta di robot singoli. Ai fini dell' | ||
- | **Il server mi restituisce a volte -1 in risposta al comando BATTERY, è un errore del server?** | ||
- | \\ | ||
- | No, il valore restituito è del tutto corretto. Si raccomanda di verificare la propria interpretazione del valore, perché... | ||
- | //En este mundo traidor, nada es verdad, ni mentira: todo es según el color del cristal con que se mira//. |
lpr-a/progetto4.1292331910.txt.gz · Ultima modifica: 14/12/2010 alle 13:05 (14 anni fa) da Vincenzo Gervasi