Per attendere il completamento dei thread devi utilizzare awaitTermination.

listFrames.add( pool.submit(new ServerCThread(clientSocket)).get()); //qui si blocca!!!
qui fai il submit del Callable e ti viene reso un oggetto Future il cui metodo get rende il risultato del Callable se è disponibile altrimenti attende la fine del task per poi continuare il normale flusso e quindi ritornare al controllo della condizione del while in questo caso.

Riguardo al problema col client/server, che indirizzo ha nella rete il tuo pc server? che porta usi? Quale eccezione viene lanciata e da chi?