A dire il vero e' anche inutile tenere un contatore, potresti sempre utilizzare un Vector per tenere traccia di tutti i client connessi, quindi usare le dimensioni di tale Vector per limitare il numero massimo di connessioni.
Chiaramente il Vector e' solo un idea... vedi tu quale struttura dati puo' farti piu' comodo.
Quando un client cade chiudendo il socket, il thread che sul server si occupa di comunicare con il client caduto riceve un'eccezione. Nella catch di quell'eccezione puoi mettere una chiamata ad un metodo del server principale che si occupa di terminare il thread ora inutile, di toglierlo dal Vector, ed ecco che hai liberato un posto per accettare una nuova connessione.
L'unica cosa che non ricordo e' se l'eccezione viene lanciata nel momento in cui il client si sconnette, o solo al momento in cui il thread sul server cerca di inviare un messaggio su tale socket. In questo caso ti basta implementare nel protocollo un messaggio di conferma, da richiedere periodicamente ai client, per verificare che essi siano ancora connessi.