Ti ho scritto 2 righe veloci di esempio:

Ho gestito il numero di client connessi tramite una classe esterna per comodità:

ClientN.java
codice:
class ClientN {
  static int n;
  
  static {
    n = 0;
  }
}
Client.java

codice:
import java.io.*;
import java.net.*;

class Client {
  public static void main(String[] args) {
    ObjectInputStream ois = null;
    ObjectOutputStream oos=null;
    
    try {
      Socket socket = new Socket("127.0.0.1",6354);
      while(true) {
        oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(new String("Client"));
        
        ois = new ObjectInputStream(socket.getInputStream());
        String testo = (String) ois.readObject();
        System.out.println("Testo ricevuto dal server: "+testo);
      }
    } catch(Exception e) {}
    finally {
      try {
        oos.close();
        ois.close();
      } catch(Exception e) {}
    }
  }
}
Server.java
codice:
import java.net.*;
import java.io.*;

class Server {
  public static void main(String[] args) {
    Socket socket;
    ServerSocket ss = null;
    
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;
    
    try {
      ss = new ServerSocket(6354);
      
      while(true) {
        socket = ss.accept();
        System.out.print("Nuovo Client Connesso.\nMessaggio del Client: ");
        ois = new ObjectInputStream(socket.getInputStream());
        String testo = (String) ois.readObject();
        System.out.println(testo);
        
        oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(new String("Benvenuto "+ClientN.n+"\r\n"));
        ClientN.n++;
      }
    } catch(Exception e){}
      finally {
        try {
          ss.close();
          oos.close();
          ois.close();
        } catch(Exception e) {}
      }
  }
}
Io tratto i flussi come oggetti, quindi puoi passare da uno String come in questo caso, ad un tuo oggetto creato ad hoc.
Se hai domande poni pure. ^^