Scambio di messaggi tra Client e Server.


L'applicazione che si costruirà mostra un'interfaccia grafica che realizza una finestra con una casella in cui scrivere un messaggio da trasmettere e una Text Area in cui si mostrano i messaggi ricevuti.

Un'applicazione svolge il ruolo di server e l'altra il ruolo di client.

Si dovrà lanciare in esecuzione prima l'applicazione server, la quale resta in attesa di una richiesta di connessione da qualcuna delle applicazioni client che potrebbe essere lanciata in esecuzione sui computer della rete locale.
Se si tenta di lanciare prima l'applicazione client si otterrà un messaggio di errore perchè nessun server risponderà con l'accettazione ad aprire la connessione.






Gestore degli eventi sulla Finestra
1 import java.io.*;
2 import java.awt.*;
3 import java.awt.event.*;
4 class GestoreFinestra implements WindowListener {
5     public void windowIconified(WindowEvent e) {}
6     public void windowDeiconified(WindowEvent e){}
7     public void windowActivated(WindowEvent e){}
8     public void windowDeactivated(WindowEvent e){}
9     public void windowOpened(WindowEvent e){}
10     public void windowClosed(WindowEvent e){}
11    public void windowClosing(WindowEvent e){
12         System.exit(0);
13    }
14 }

Scambio di messaggi tra Client e Server.
Le due classi hanno la stessa struttura. Vengono mostrate affiancate, su righe numerate, per evidenziare le differenze tra l'una e l'altra.

Commenti:
(Riga 6) la classe eredita le proprietà e le funzionalità della classe Frame e ridefinisce i gestori degli eventi associati ai pulsanti.
(Riga 7 lato server) si definisce il riferimento al gestore dell'evento "ricevuto richiesta di apertura connessione"
(Riga 8) Riferimento ad una connessione.



Commenti al costruttore:
(Riga 17) si da un titolo alla finestra.
(Righe 18 - 28) si dispongono i componenti sulla finestra.


Commenti:
(Riga 30) Il server si predispone sulla porta di ascolto, Il client emette la richiesta di apertura connessione con l'applicazione in esecuzione sul computer remoto e in ascolto sulla porta 4444.
In caso di errore si fornisce il messaggio di errore e si termina.
(Riga 36) Il server resta in attesa di una richiesta di apertura connessione, pronto ad accettarla.
(Riga 45) il gestore di evento associato al pulsante "Invia" si trova in questa classe.







Esercizi:
  • aggiungere una casella che consenta di inserire l’indirizzo, o il nome, del server a cui connettersi, al posto di localhost.
    • Il programma dovrebbe abilitare il pulsante per inviare un messaggio solo dopo che si è scelto il nome del server.
    • In una label mostrare lo stato “connesso” o “non connesso”.
  • Aggiungere una casella per inserire il nome del mittente e modificare sia il client che il server affinché il server mostri, nella text Area, oltre al messaggio, anche il nome del mittente.
  • Usare una label per mostrare il risultato fornito da ciascuno dei seguenti altri metodi della classe Socket: getInetAddress(), getLocalAddress(), getPort(), isClosed().