Sorgenti Java per il programma di Laboratorio
I link elencati nel seguito conducono ai sorgenti java dei principali programmi sviluppati nell'ambito del corso. Essi possono essere copiati localmente, quindi compilati e mandati in esecuzione. Naturalmente, possono essere anche modificati a piacimento.
Per poter compilare i sorgenti ed eseguire i programmi è necessario scaricare ed installare la macchina virtuale Java, che si trova qui. Una volta in quella pagina seguire il link relativo al JDK e quindi scegliere la versione adatta alla propria piattaforma di calcolo.
Per quanto riguarda gli stream per la gestione di messaggi, che verranno usati nelle esercitazioni 11 e 12, è possibile consultare la documentazione in linea tratta dal libro di Hughes, C. Hughes, M. Shoffner, M. Winslow: Java Network Programming, Manning Publications Co.
In particolare sono per noi significativi i package prominence.msg e prominence.util
Esercitazione nº 1
Una semplice applicazione per impratichirsi con le fasi di creazione, compilazione ed esecuzione. L'applicazione presenta una scarna interfaccia utente, dotata di alcuni campi testo, aree testo e bottoni. Esiste una minimale gestione degli eventi.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file BaseAppE1.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Premere i vari pulsanti.
Esercitazione nº 2
Una applicazione che copia quanto immesso nello standard input sullo standard output.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file InToOut.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Immettere ciò che si vuole nelle schermate successive. Per terminare, premere OK senza immettere nulla (ciò invia un EOF).
Esercitazione nº 3
Una applicazione che apre un file di testo e lo visualizza in una textArea, e che salva il contenuto della stessa textArea in un nuovo file di testo.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file BaseAppE3.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Immettere nella textArea con etichetta "Nome file" il nome del file da aprire o salvare, e quindi premere il pulsante "Apri" oppure "Salva".
- Ricordare che i file da leggere devono trovarsi nello stesso direttorio dell'applicazione "Java Runner". Nello stesso direttorio appaiono i file che vengono scritti.
Esercitazione nº 4
Una applicazione che apre una connessione di rete con un server, invia il comando immesso in una textArea, e mostra la risposta del server in un'altra textArea.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file BaseAppE4.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Immettere il nome (o numero IP) dell'host ed il numero di port a cui ci si vuole collegare nei corrispondenti textField.
- Premere il bottone "Connect" per stabilire la connessione.
- Premere il bottone "Send" per inviare il comando preventivamente immesso nella corrispondente textArea.
- Premere il bottone "Receive" per visualizzare una riga di testo della risposta inviata dal server. Attenzione: se si preme il bottone e non c'è più nulla in arrivo dal server, il programma si blocca (per sempre) in attesa di leggere ciò che non arriverà mai!
Esercitazione nº 5
Un semplice server che accetta una sola connessione sul port 5000 e restituisce al client tutto ciò che riceve.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file SimpleServer.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- A causa di un bug del JDK 1.0.2 relativo all'implementazione del metodo ServerSocket.accept(), il programma SimpleServer deve essere eseguito tramite una diversa macchina virtuale Java, quale ad esempio quella fornita da Apple Computer (MacOS Java Runtime).
- Per connettersi a SimpleServer si può usare il client sviluppato nell'esercitazione nº 4.
Esercitazione nº 6
Applicazione che lancia due thread, i quali scrivono con cadenze diverse un messaggio ciascuno sullo standard output.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file PingPong.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Per terminare l'applicazione, usare il menu Quit o premere Quadrifoglio-q.
Esercitazione nº 7
Applicazione simile alla precedente, realzzata tramite l'interfaccia Runnable.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file RPingPong.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Per terminare l'applicazione, usare il menu Quit o premere Quadrifoglio-q.
Esercitazione nº 8
Una applicazione che apre una connessione di rete con un server, invia il comando immesso in una textArea, e mostra la risposta del server in un'altra textArea. E' simile all'esercitazione nº 4, ma sfrutta un thread separato per la ricezione dei dati dal server.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file BaseAppE8.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Immettere il nome (o numero IP) dell'host ed il numero di port a cui ci si vuole collegare nei corrispondenti textField.
- Premere il bottone "Connect" per stabilire la connessione.
- Premere il bottone "Send" per inviare il comando preventivamente immesso nella corrispondente textArea.
- Non esiste più il bottone "Receive", in quanto i dati in arrivo dal server sono recepiti da un thread separato che rimane sempre in ascolto. Ciò elimina la necessità di sapere esattamente quante linee di testo devono essere lette.
Versione Applet
Seguendo questo link si carica dal server Web, per mezzo di un'apposita pagina html, una versione di questa applicazione che si avvia come applet, all'interno della pagina html stessa. Le funzionalitò sono analoghe a quelle dell'applicazione precedente, salvo per il fatto che non si possono aprire connessioni di rete con host diversi da quello da cui è stato scaricato l'applet.
Esercitazione nº 9
Un server multithreaded che accetta connessioni sul port 5000 e restituisce ai client connessi, in broadcast, tutto ciò che riceve da ciascuno di essi. Inoltre manda a tutti un avviso ogniqualvolta un client si connette o si sconnette.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file ChatServer.class.
Sorgenti Java del server per jdk 1.0.2:
Sorgenti Java del server per jdk 1.1.x:
Note d'uso:
- A causa di un bug del JDK 1.0.2 relativo all'implementazione del metodo ServerSocket.accept(), il programma ChatServer deve essere eseguito tramite una diversa macchina virtuale Java, quale ad esempio quella fornita da Apple Computer (MacOS Java Runtime).
Per connettersi a ChatServer si deve usare il client di cui ai link successivi. Esso è una semplice variazione del client sviluppato nell'esercitazione nº 8. La differenza consiste nel fatto che questa versione del client invia automaticamente al server, appena vi si connette, una linea di testo (prelevata dalla TextArea con etichetta "Command") che il server utilizza successivamente come identificativo dell'utente connesso. In questo modo si realizza di fatto una minimale architettura di tipo client-server.
Sorgenti Java del client per jdk 1.0.2:
Sorgenti Java del client per jdk 1.1.x:
Esercitazione nº 10
Una applicazione che mostra un esempio di schema produttore-consumatore facendo ricorso ai metodi wait() e notify().
La classe Consumer rappresenta un consumatore che cerca di consumare un oggetto (se c'è) estraendolo da un Vector. Usa un thread separato per questo, e sfrutta wait() per rimanere in attesa finché non risulta disponibile un oggetto da consumare.
Il produttore è costituito dall'utente, che attraverso il thread principale (quello del main()) aggiunge oggetti e utilizza notify() per risvegliare il consumatore.
Istruzioni:
- Salvare localmente i file java di cui ai link successivi.
- Compilare i file con il compilatore Java.
- Mandare in esecuzione il file Consumer.class.
Sorgenti Java per jdk 1.0.2:
Sorgenti Java per jdk 1.1.x:
Note d'uso:
- Premere OK alla prima schermata senza immettere dati (è quella relativa ai parametri del main).
- Immettere ciò che si vuole nelle schermate successive. Per vedere qualcosa sull'output, premere OK senza immettere nulla. Per terminare, premere due volte OK senza immettere nulla.
Esercitazione nº 11
Esempio di sistema client-server per la gestione di transazioni, basato sull'uso di stream di messaggi.
E' costituito da un client e da un server multithreaded. Quest'ultimo accetta e gestisce molte transazioni in concorrenza. Grazie all'uso dei messaggi, i dati relativi alle diverse transazioni possono viaggiare sullo stesso canale di comunicazione senza disturbarsi a vicenda.
Istruzioni:
NOTA: poiché le classi di utilità per la gestione dei messaggi costituiscono uno o più Package, è necessario seguire accuratamente le istruzioni sotto riportate (con particolare riguardo alla struttura di direttori che deve essere creata) per poter compilare con successo i sorgenti del client e del server.
- Salvare localmente i file java di cui ai link successivi, creando una struttura di direttori secondo le indicazioni riportate.
- Compilare i file TransactionClient.java e TransactionServer.java con il compilatore Java (questo implica automaticamente anche la compilazione delle classi di utilità).
- Mandare in esecuzione il file TransactionServer.class con la macchina virtuale Jrunner di Apple.
- Mandare in esecuzione il file TransactionClient.class con la macchina virtuale del JDK.
Sorgenti Java per jdk 1.0.2 e relative relazioni nella struttura dei direttori da creare:
Direttorio di lavoro (da creare dove si vuole e col nome desiderato)
Sorgenti Java per jdk 1.1.x e relative relazioni nella struttura dei direttori da creare:
Direttorio di lavoro (da creare dove si vuole e col nome desiderato)
Note d'uso per il server:
- Dopo averlo lanciato, alla prima schermata immettere come parametri (nel campo Parameters, separati da uno spazio) il numero di port su cui deve mettersi in ascolto ed il numero di thread da attivare. Ad esempio, immettere:
5000 10
Note d'uso per il client:
Esercitazione nº 12
Chatline grafica e testuale, basata sul multiplexing di stream di messaggi. E' costituita da un client, che consente di inviare del testo oppure un disegno effettuato a mano libera, e da un server multithreaded.
Il client è costituito da due componenti distinte. La prima invia al server di volta in volta un pacchetto contenente il testo che è presente in un TextField, non appena si preme il tasto Return dentro tale TextField. La seconda invia al server di volta in volta un pacchetto contenente la rappresentazione di un tratto disegnato a mano libera, non appena si rilascia il pulsante del mouse dopo aver creato tale tratto.
Grazie all'uso dei messaggi, i pacchetti generati dalle due componenti viaggiano sullo stesso canale di comunicazione senza disturbarsi a vicenda. Successivamente, quando tali pacchetti (grazie al ruolo svolto dal server) raggiungono un client, questi li smista alla corretta componente (testuale o grafica) che provvede a gestirli opportunamente.
Il server accetta connessioni sul port 5000 e restituisce ai client connessi, in broadcast, tutto ciò che riceve da ciascuno di essi.
Istruzioni:
NOTA: poiché le classi di utilità per la gestione dei messaggi costituiscono uno o più Package, è necessario seguire accuratamente le istruzioni sotto riportate (con particolare riguardo alla struttura di direttori che deve essere creata) per poter compilare con successo i sorgenti del client e del server.
- Salvare localmente i file java di cui ai link successivi, creando una struttura di direttori secondo le indicazioni riportate.
- Compilare i file che costituiscono il client, e cioé CollabTool.java, Chatboard.java e WhiteBoard.java con il compilatore Java (questo implica automaticamente anche la compilazione delle necessarie classi di utilità).
- Compilare i file che costituiscono il server, e cioé CollabServer.java e CollabHandler.java con il compilatore Java (questo implica automaticamente anche la compilazione delle necessarie classi di utilità).
- Mandare in esecuzione il file CollabServer.class con la macchina virtuale Jrunner di Apple.
- Mandare in esecuzione il file CollabTool.class con la macchina virtuale del JDK.
Sorgenti Java per jdk 1.0.2 e relative relazioni nella struttura dei direttori da creare:
Direttorio di lavoro (da creare dove si vuole e col nome desiderato)
Sorgenti Java per jdk 1.1.x e relative relazioni nella struttura dei direttori da creare:
Direttorio di lavoro (da creare dove si vuole e col nome desiderato)
Note d'uso per il server:
- Dopo averlo lanciato, alla prima schermata premere Execute senza immettere nulla.
Note d'uso per il client:
- Dopo averlo lanciato, alla prima schermata immettere come parametro il nome dell'host su cui è in ascolto il server. Ad esempio, immettere:
nomehost.dsi.uniroma1.it