Bueno ammigo tal vez ya tienes el programa pero te dejo a qui un link
https://www.youtube.com/watch?v=zZIeUCBKwjc
https://www.youtube.com/watch?v=VvKv0EN6q0k
donde podras ver un muy buen video de como hacerlo
y si necesitas todo lo que mencionaste. yo hice uno en la universidad te dejo mi codigo por si lo quieres va:
package servidorchat;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* Servidor para el chat.
*
* @author Ivan Salas Corrales <
http://programando-o-intentandolo.blogspot.com.es/>
*/
public class ServidorChat {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Carga el archivo de configuracion de log4J
PropertyConfigurator.configure("log4j.properties");
Logger log = Logger.getLogger(ServidorChat.class);
int puerto = 1234;
int maximoConexiones = 10; // Maximo de conexiones simultaneas
ServerSocket servidor = null;
Socket socket = null;
MensajesChat mensajes = new MensajesChat();
try {
// Se crea el serverSocket
servidor = new ServerSocket(puerto, maximoConexiones);
// Bucle infinito para esperar conexiones
while (true) {
log.info("Servidor a la espera de conexiones.");
socket = servidor.accept();
log.info("Cliente con la IP " + socket.getInetAddress().getHostName() + " conectado.");
ConexionCliente cc = new ConexionCliente(socket, mensajes);
cc.start();
}
} catch (IOException ex) {
log.error("Error: " + ex.getMessage());
} finally{
try {
socket.close();
servidor.close();
} catch (IOException ex) {
log.error("Error al cerrar el servidor: " + ex.getMessage());
}
}
}
}
_________________________________________________________________________
package servidorchat;
import java.util.Observable;
/**
* Objeto observable del patron observer.
*
* @author Ivan Salas Corrales <
http://programando-o-intentandolo.blogspot.com.es/>
*/
public class MensajesChat extends Observable{
private String mensaje;
public MensajesChat(){
}
public String getMensaje(){
return mensaje;
}
public void setMensaje(String mensaje){
this.mensaje = mensaje;
// Indica que el mensaje ha cambiado
this.setChanged();
// Notifica a los observadores que el mensaje ha cambiado y se lo pasa
// (Internamente notifyObservers llama al metodo update del observador)
this.notifyObservers(this.getMensaje());
}
}
__________________________________________________________________________________