Un piccolo server:
codice:
import java.io.*;
import java.net.*;
import java.util.Vector;

public class MioServer extends Thread {

   private class GestioneClient extends Thread {
      private ObjectInputStream ois;
      private ObjectOutputStream oos;
      public GestioneClient(ObjectInputStream ois, ObjectOutputStream oos) throws Exception {
         this.ois = ois;
         this.oos = oos;
      }
      public void run() {
         try {
            // Attendo l'arrivo di un messaggio
            msg = (String) ois.readObject();

            // Elaboro il messaggio arrivato
            System.out.println("Server - ho ricevuto questo messaggio: " + msg);
         } catch (Exception e) { e.printStackTrace(); }
      }

      public void inviaMessaggio(String messaggio) {
         // Invio il messaggio al client
         try {
            oos.writeObject(messaggio);
         } catch (Exception e) { e.printStackTrace(); }
      }
   }

   private ServerSocket server;
   private Socket client;
   private Vector listaClient;
   private final int PORTA = 2525;

   public MioServer() {
      try {
         listaClient = new Vector();
         server = new ServerSocket(PORTA);
      } catch (Exception e) { e.printStackTrace(); }
   }

   public void run() {
      try {

         // Attendo che un client si colleghi al server
         client = server.accept();
         listaClient.add(
            new GestioneClient(
               new ObjectInputStream(client.getInputStream()),
               new ObjectOutputStream(client.getOutputStream())
            )
         );

         // Avvio il gestore del client appena connesso
         ((GestioneClient) listaClient.elementAt(listaClient.size()-1)).start();
      } catch (Exception e) { e.printStackTrace(); }
   }

   public static void main(String [] args) {
      MioServer ms = new MioServer();
   }
}
Un piccolo client:
codice:
import java.io.*;
import java.net.*;

public class MioClient extends Thread {

   private Socket server;
   private ObjectInputStream ois;
   private ObjectOutputStream oos;
   private InetAddress mioIndirizzo;
   private final int PORTA = 2525;
   private byte [] ipServer = {/* IP del server */};
   /* Esempio di IP del server: 158.110.0.1
      {(byte) 158, (byte) 110, (byte) 0, (byte) 1} */

   public MioClient() {
      try {
         indirizzo = InetAddress.getByAddress(ipServer);
      } catch (Exception e) { e.printStackTrace(); }
   }

   public void run() {
      try {

         // Mi collego al server
         server = new Socket(indirizzo, PORTA);
         ois = new ObjectInputStream( server.getInputStream() );
         oos = new ObjectOutputStream( server.getOutputStream() );
         while (true) {
            // Attendo il messaggio
            String msg = (String) ois.readObject();

            // Elaboro il messaggio
            System.out.println(msg);
         }

      } catch (Exception e) { e.printStackTrace(); }
   }

   public void inviaMessaggio(String messaggio) {
      // Invio il messaggio
      try {
         oos.writeObject(messaggio);
      } catch (Exception e) { e.printStackTrace(); }
   }

   public static void main(String [] args) {
      MioClient mc = new MioClient();
   }
}
Questo è un piccolo esempio (non tanto usabile) di Client e di Server. Queste due classi classi possono essere usate all'interno di applicazioni più grandi (ovviamente adattate) per avere un Server in attesa di n clients, e per avere un client che si collega al server.

I messaggio qui sono delle semplici Stringhe, nulla ti vieta di usare classi più complesse che implementano Serializable.


Ciao.