Bom, só pra se ter uma idéia, um chat tipo o MSN trabalha mais ou menos assim:
Você tem um servidor utilizando sockets ( para a conexão e comunicação com os clientes) e Threads (para tratar a conexão dos inúmeros clientes).
O cliente, deve se conectar com o servidor, e este vai retornar todos os outros clientes conectados.
Quando você vai enviar uma mensagem para um determinado cliente, deve enviar também a informação se a mensagem vai para todos ou só para um e se só pra um, quem é este.
Um servidor simples para se começar a implemetar, pode guardar os clientes conectados em um vetor, e quando um cliente saí, retira-se ele do vetor.
O cliente deve possuir Thread também, pois senão, você não conseguirá receber mensagens a qualquer momento. Deve-se tratar recebimento e envio de mensagens de forma diferente.
Acho que é mais ou menos assim mesmo.
Espero ter ajudado!
Abraço!