Sì... ora che vedo meglio è ovvio che si blocchi. Appena arriva un client entra in un loop stretto (attesa attiva). Non si gestisce così l'architettura client-server: quando arriva un client non devi entrare in un loop, ma avviare un Thread che lo gestisca. All'interno di questo thread puoi mettere un loop. Quindi devi gestire l'arrivo di un client nel modo seguente:
codice:
server = new ServerSocket(4444);
Socket client = server.accept(); // Bloccante!!
( new MioThread(client.getInputStream(), client.getOutputStream()) ).start();
Magari, inserisci prima il thread (la classe MioThread la devi implementare tu e deve estendere Thread) in un Vector così da poter gestire più client e da poter indirizzare ciascun thread.
La classe MioThread prende 2 parametri: l'InputStream e l'OutputStream della Socket generata da ServerSocket per poter comunicare, quindi, col client.
Se hai bisogno di ulteriori chiarimenti, posta pure!
PS: Puoi inserire la parte di creazione del Socket e la creazione del Thread in un loop, tanto la chiamata a accept() è bloccante e non comporta un loop stretto.
Ciao.