In questo articolo, vedremo come implementare una semplice Chat (comunque abbastanza completa nelle sue funzionalità) per mezzo di un Applet. In particolare, utilizzeremo un JApplet
realizzato con la versione 1.5.0_06 di J2SE.
Prerequisiti
Per avere una idea chiara della struttura del programma e delle classi utilizzate, è bene avere chiari i seguenti concetti:
- Swing e Componenti GUI
- Socket
- Thread
- Mantenere una lista degli utenti connessi visibile a tutti i partecipanti in linea
- Consentire l'accesso ad un utente previa scelta di un nickname
- Controllare che il nickname scelto da un utente non sia già in uso
- Inviare un messaggio informativo a tutti gli utenti quando entra in chat un nuovo partecipante
- Inviare un messaggio informativo a tutti gli utenti quando un partecipante esce dalla chat
- Notificare tutti gli utenti connessi all'inserimento di un nuovo messaggio immesso da un qualsivoglia partecipante
- JChat
- ParallelClient (una inner class all'interno della classe JChat)
- JChatClient
- JChatServer
- ParallelServer (una inner class all'interno della classe JChatServer)
- JChatServerRunner
- Costruisce l'interfaccia grafica del JApplet, utilizzando alcuni componenti Swing. Inoltre, gestisce le funzioni init() e destroy() dell'Applet stesso.
- Gestisce gli eventi derivanti dalla pressione dei pulsanti "Entra in Chat" (che dopo la connessione diviene "Esci") e "Invia Messaggio"
- Crea un oggetto di classe JChatClient, che si occuperà della comunicazione via Socket con il Server.
- Crea un oggetto di classe ParallelClient il cui metodo run() gestisce la comunicazione con il Server in modo indipendente fino a quando l'utente non decide di disconnettersi dalla chat.
- Il client che intenda entrare in chat invierà un messaggio al server del tipo:
~NickName
NickName
- Un client già connesso alla chat, invierà al server, una stringa composta dal nick seguito dal carattere ':' e dal messaggio inserito nel text field indicato dalla label: "Il tuo Messaggio".
- Un client che intenda disconnettersi dalla chat invierà un messaggio al server del tipo: ^NickName, con NickName uguale al nick scelto all'inizio dall'utente.
- Il server, potrà rispondere ai client in uno dei seguenti modi:
NOGOODUSER
OKNEWUSER~NickName1~NickName2...
JList lstUsers
NEWUSERNickName
REMOVEUSERNickName
Obiettivo
La nostra chat dovrà essere in grado di:
Le classi
Le classi che realizzeremo per il nostro Applet sono:
Prima di esaminare il codice che le implementa, analizziamo il loro ruolo e comportamento in maniera generale.
La classe JChat
JApplet
JApplet
JChat
JChatClient
JChatServer
La classe ParallelClient
JChat
La classe JChatClient
Socket
La classe JChatServer
Chat
La classe JChatServerRunner
Il codice
Vediamo, innanzitutto, il codice della classe JChat
e della classe ParallelClient
, inglobata al suo interno.
Osservando il codice possiamo riassumere i compiti svolti dalla classe JChat
nel modo seguente:
È importante sottolineare il fatto che la comunicazione tra client e server dovrà essere supportata da un "linguaggio comune" che consenta uno scambio di informazioni chiaro tra i due componenti. A tale scopo, si è previsto che :
Attraverso il codice della classe JChatServer
e quindi della classe ParallelServer
, inglobata al suo interno, è possibile osservare come vengono implementate tali funzionalità. Si noti, anche in questo caso, l'uso dei thread (uno per ogni client) per restare in ascolto dei messaggi in arrivo.
La classe JChatClient
è quella che si occupa di aprire una comunicazione via Socket con il Server, tramite l'indirizzo di quest'ultimo e la porta 7777
su cui il server è in ascolto (naturalmente non è obbligatorio utilizzare questa porta).