Una semplice chat in Java!

Creato il 06 marzo 2012 da Ketek @CarloVentrella

Vediamo oggi come realizzare una semplice chat in java!

I codici che vi presento riguardano un server e un client che avranno la funzione di scambiarsi messaggi. Per comprendere il codice è sottointesa una minima conoscenza dei socket e degli stream, tuttavia facciamo un ripasso generale dei concetti chiave:

  • Socket: è un meccanismo di astrazione che permette la comunicazione tra server e client;
  • Stream : è il canale che collega client e server e attraverso il quale sono trasferiti i dati;
  • Ip : è l'indirizzo che identifica il computer al quale vogliamo connetterci;
  • Porta: è il punto attraverso il quale saranno trasferiti i dati durante la comunicazione;
  • Threaduno o più processi appartenenti allo stesso programma.

A questo punto passo subito a mostrarvi il codice:

Server.java

import java.net.*;
import java.io.*;

public class server implements Runnable{
// setto le variabili ----------------->
public ServerSocket ss = null;
public Socket s = null;
public ObjectOutputStream OOS = null;
public ObjectInputStream OIS = null;
public BufferedReader br = null;
public Thread t = null;
public String str = null;
// ------------------------------------>
public server() throws IOException, ClassNotFoundException
{
// resto in ascolto sulla porta 9999
ss = new ServerSocket(9999);
System.out.println("In attesa di client...");
s = ss.accept();
System.out.println("** Un client si è connesso **");
System.out.println("IP: "+s.getInetAddress());
System.out.println("Porta: "+s.getPort());
String str = "";
// inizializzo gli stream che mi permetteranno di inviare e ricevere i mess ->
OOS = new ObjectOutputStream(s.getOutputStream());
OIS = new ObjectInputStream(s.getInputStream());
// -------------------------------------------------------------------------->
// questo stream rimane in ascolto della tastiera
br = new BufferedReader(new InputStreamReader(System.in));
t = new Thread(this);
t.start();
while(s.isConnected())
{
// leggo quello che mi arriva dal client
while((str = (String) OIS.readObject())!= null)
{
System.out.println("\\Client: "+str);
}
}
}
public void run()
{
while(s.isConnected())
{
try {
// leggo tutto quello che viene premuto sulla tastiera
while((str = br.readLine() )!= null)
{
System.out.println("\\Io: "+str);
// invio
OOS.writeObject(str);
OOS.flush();
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println("** Il client potrebbe essersi disconnesso! **");
}
}
}
public static void main(String[] Args) throws IOException, ClassNotFoundException
{
new server();
}
}

Copia tutto

Client.java


import java.net.*;
import java.io.*;

public class client implements Runnable
{
// setto le variabili ----------------->
public Socket s = null;
public ObjectOutputStream OOS = null;
public ObjectInputStream OIS = null;
public BufferedReader br = null;
public Thread t = null;
public String str = "";
// ------------------------------------>
public client() throws IOException, ClassNotFoundException
{
// mi connetto all'ip localhost alla porta 9999
s = new Socket("localhost", 9999);
System.out.println("** Sono connesso con il server **");
System.out.println("IP: "+s.getInetAddress());
System.out.println("Porta: "+s.getPort());
// inizializzo gli stream che mi permetteranno di inviare e ricevere i mess ->
OOS = new ObjectOutputStream(s.getOutputStream());
OIS = new ObjectInputStream(s.getInputStream());
// -------------------------------------------------------------------------->
// questo stream rimane in ascolto della tastiera
br = new BufferedReader(new InputStreamReader(System.in));
t = new Thread(this);
t.start();
while(s.isConnected())
{
// leggo quello che mi arriva dal server
while((str = (String) OIS.readObject())!= null)
{
System.out.println("\\Server: "+str);
}
}
}
public void run()
{
while(s.isConnected())
{
try {
// leggo tutto quello che viene premuto sulla tastiera
while((str = br.readLine() )!= null)
{
System.out.println("\\Io: "+str);
// invio
OOS.writeObject(str);
OOS.flush();
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println("** Il server potrebbe essersi disconnesso! **");
}
}
}
public static void main(String[] Args) throws IOException, ClassNotFoundException
{

new client();
}
}

Copia tutto

Potete notare subito che i due codici differiscono solo per la fase di "connessione, inoltre l'uso dei commenti dovrebbe agevolarvi ancor più lo loro comprensione.

Innanzitutto abbiamo la connessione del server che rimane in ascolto sulla porta 9999 (a piacere) fino alla connessione di un client. Questo si connetterà alla porta 9999 del computer che ha come indirizzo ip "localhost" (vedi N.B).

A questo punto i codici coincidono:

Vengono creati gli stream che gestiranno l'invio/ricezione dei messaggi e quello che controllerà l'input da tastiera.

A questo punto viene creato un thread in modo tale da far avvenire contemporaneamente (in realtà non è così) l'invio dei messaggi e la loro ricezione. Questi sono dunque necessari per far sì che il client/server possa inviare e allo stesso tempo ricevere!

Vorrei farvi notare inoltre che le eccezioni sono state inserite tramite thrown in modo da rendere chiara la comprensione del codice. Tuttavia sarebbe utile controllarle utilizzando metodi try/catch che ci garantissero una migliore gestione degli errori:

una disconnessione improvvisa di uno dei due programmi ci porterebbe ad un output pieno di messaggi d'errore e ad una interruzione della esecuzione. Al contrario, una migliore gestione degli errori ci porterebbe ad un uscita dall'esecuzione più elegante che si tradurrebbe in un messaggio del tipo:

** Spiacente, sembra che il client/server si sia disconnesso **

N.B

Se i due codici girano su due computer connessi tramite LAN l'indirizzo ip è quello che trovate digitando ipconfig /all nel prompt dei comandi (es. 192.168.251.1).

Se i due codici girano su due computer connessi a reti indipendenti l'indirizzo ip è quello che trovate su questo sito (ci dovete andare dal server) e che sarà diverso ogni volta che il server spegnerà il modem/router.(ex. 79.32.55.15).  Ripeto che l'indirizzo IP deve riferirsi del server!



Potrebbero interessarti anche :

Possono interessarti anche questi articoli :