Je vois l'autre réponse qui vient d'être postée, mais je pense que vous êtes interactif avec des clients qui jouent votre jeu, donc je peux vous proposer une autre approche (bien que BufferedReader soit certainement valable dans certains cas).
Si vous le souhaitez, vous pouvez déléguer la responsabilité de l'enregistrement au client. Par exemple, vous auriez une collection d'utilisateurs connectés avec un horodatage du dernier message reçu de chacun d'entre eux... si un client se déconnecte, vous forceriez un réenregistrement du client, mais cela conduit à la citation et à l'idée ci-dessous.
J'ai lu que pour déterminer si une prise a ou non un fermée, des données doivent être écrites sur le flux de sortie et une exception doit être capturée. Cela semble être une façon vraiment impropre de gérer cette situation.
Si votre code Java n'a pas fermé/déconnecté la socket, comment pourriez-vous être informé que l'hôte distant a fermé votre connexion ? En fin de compte, votre try/catch fait à peu près la même chose que ce que ferait un poller qui écouterait les événements sur la socket réelle. Considérez ce qui suit :
- votre système local pourrait fermer votre socket sans vous en avertir... c'est juste l'implémentation de Socket (c'est-à-dire qu'il n'interroge pas le matériel/pilote/firmware/quoi que ce soit pour le changement d'état).
- new Socket(Proxy p)... il y a plusieurs parties (6 points d'extrémité en fait) qui pourraient fermer la connexion...
Je pense que l'une des caractéristiques des langues abstraites est qu'elles permettent de s'affranchir des détails. Pensez au mot-clé using en C# (try/finally) pour les SqlConnection s ou autres... c'est juste le coût de l'activité... Je pense que try/catch/finally est le modèle accepté et nécessaire pour l'utilisation de Socket.