Vérifier si une ClientSocket a déconnecté dans java se bloque

C'est un suivi à:

cette question

En gros, j'ai un serveur boucle qui gère une connexion à un solitaire client. À un moment donné dans la boucle, si un ClientSocket existe, il tente une lecture pour vérifier si le client est toujours connecté:

if (bufferedReader.read()==-1 ) {
       logger.info("CONNECTION TERMINATED!");
       clientSocket.close(); 
       setUpSocket(); //sets up the server to reconnect to the client
}else{
        sendHeartBeat(); //Send a heartbeat to the client
}

Le problème est, qu'une fois qu'un socket a été créé l'application se bloque sur la lecture, je suppose attente pour les données qui ne viendra jamais, depuis que le client n'envoie jamais sur le serveur. Avant c'était OK, parce que cela correctement traitées se déconnecte (la lecture serait finalement échouer lorsque le client s'est déconnecté), et la boucle serait tenter de rétablir la connexion. Cependant, j'ai maintenant ajouté ci-dessus sendHeartBeat() la méthode, qui, périodiquement, permet au client de savoir que le serveur est encore en place. Si la lecture est tenue le fil puis les battements de cœur de ne jamais arriver!

Donc, je suppose que je suis en train de tester si la connexion est toujours pas correctement. Je pourrais, comme un rapide hack, exécutez la bufferedReader.read() dans un autre thread, mais je vais avoir toutes sortes de problèmes de concurrence que je n'ai vraiment pas envie de traiter avec.

Donc la question est quelques fois:
1) Suis-je vérifier pour un client déconnecter correctement?
2) Si non, comment dois-je faire?
3) Si je le fais correctement comment je puis-je obtenir le lire pour ne pas tenir les processus en otage? Ou est-threading le seul moyen?

OriginalL'auteur Alex | 2009-03-30