InputStream e OutputStream sono gli oggetti con i quali costruire gli ObjectInputStream e ObjectOutputStream.
Ecco del codice d'esempio (supponiamo che la Socket si chiami, per comodità socket):
codice:
--- Lato Client ---
ObjectInputStream ois;
ObjectOutputStream oos;
try {
// Costruisco l'oggetto per ricevere i messaggi dal server
ois = new ObjectInputStream( socket.getInputStream() );
// Costruisco l'oggetto per mandare i messaggi al server
oos = new ObjectOutputStream( socket.getOutputStream() );
// Mando un messaggio al server
oos.writeObject("Ciao, io sono il client!");
// attendo la risposta dal server
String risposta = ((String) ois.readObject());
// Stampo la risposta del server
System.out.println("Il server ha risposto: " + risposta);
} catch (Exception e) {}
--- Lato server ---
ObjectInputStream ois;
ObjectOutputStream oos;
try {
// Costruisco l'oggetto per ricevere i messaggi dal client
ois = new ObjectInputStream( socket.getInputStream() );
// Costruisco l'oggetto per mandare i messaggi al client
oos = new ObjectOutputStream( socket.getOutputStream() );
// attendo un messaggio dal client
String messaggio = ((String) ois.readObject());
// Stampo il messaggio del client
System.out.println("Il client mi ha mandato un messaggio: " + messaggio);
// Mando la risposta
oos.writeObject("Messaggio ricevuto.");
} catch (Exception e) {}
Ovviamente questa cosa è semplicemente dimostrativa: il server sa che il client gli manderà il messaggio, quindi lo attende ed il client, viceversa, sa che dopo aver inviato un messaggio al server, riceverà una risposta. Cosa che in una chat non succede per niente: il server non sa QUANDO riceverà un messaggio dal client ed il client a sua volta non sa SE riceverà un messaggio dal server.
Per modellare questa situazione, uno strumento valido sono i thread: basta inserire l'oggetto di ricezione messaggi in un thread (sia nel server che nel client), in modo che quando arriva un messaggio se ne occupi lui. Per i messaggi in uscita è semplice: quando l'utente invia il messaggio il client effettua una chiamata al metodo writeObject(). Di solito il server non invia messaggi di sua iniziativa, ma si occupa semplicemente di rispedire un messaggio di un utente agli altri client collegati, quindi la chiamata al metodo writeObject() nel server dovrà per forza seguire la ricezione di un messaggio.
Gli oggetti InputStream e OutputStream possono essere utilizzati anche per costruire degli oggetti BufferedInputStream e BufferedOutputStream.
Ciao.