É possível.
Mas seu problema não são mais as threads, e sim, em criar um protocolo.
Agora você que você consegue saber que clientes estão conectados e armazenar um índice para eles, é hora de sentar e pensar em como será a comunicação com esses clientes.
Defina as mensagens que o servidor enviará para os clientes e vice-versa. Por exemplo, essa seria uma possível troca de mensagens do cliente na hora da conexão:
Cliente conecta no servidor. Envia então:
1 string dizendo o seu nome
O servidor responde
1 byte com identificador da mensagem (conexão OK)
1 int dizendo o ID de cliente
1 int dizendo quantos bytes tem o nome de um cliente conectado
A string com o nome do cliente
(e esses dois últimos dados, o tam e o nome, se repetem até que o tamanho seja = 0)
O servidor envia aos demais clientes
1 byte com o identificador da mensagem (novo cliente conectado)
1 int com o tamanho do string do nome do cliente
O string com o nome do cliente
1 int com o ID desse cliente
O cliente quer se comunicar com outro cliente, em particular, ele envia:
1 byte com o identificador da mensagem (comunicar somente com)
1 int com o ID do cliente
1 int com o tamanho da mensagem
String com a mensagem.
E assim por diante. Ao invés de um array de clientes, será melhor ter um MAP do ID do cliente para seu Socket. Quando o servidor recebe uma mensagem (como a mensagem de “comunicar somente com”) ele decodifica, localiza o cliente nesse map que deve receber a mensagem, e envia só para eles. Defina mensagens para tudo mais que você quiser fazer (desconectar do servidor, mensagem pública, etc).
Curiosidade: Esse seu protocolo é chamado protocolo de aplicação e localiza-se na sétima camada do TCP/IP. Outros protocolos assim são o FTP, HTTP, etc.
Outra dica: Ao invés de bytes brutos para lá e para cá, pode ser uma boa idéia passar só um textão com um XML. É menos econômico, mas dependendo do tamanho do seu protocolo, pode ser mais fácil usar o próprio DOM para parsear a mensagem. Se for um trabalho de faculdade, ou só uma aplicação “de brinquedo”, eu faria usando os bytes diretamente.