A chaque requête, serverSocket.accept() produit une instance de Socket, différente. Pour chacunes de ces instances, un thread indépendant va s'occuper de traiter la requête (au passage, ça pourrait être un pool de threads, auquel tu passerais l'instance de ThreadServeur - voir java.util.concurrent.Executor ). Tu ouvres un inputStream pour lire ce qui est envoyé par le client, et un outputStream pour envoyer (une réponse) au client, et tu les fermes quand tu as fini d'envoyer Et l'instance de socket également. Il n'y a pas besoin de les réouvrir pour cette socket. Les autres échanges seront fait dans une autre requête, donc dans une autre instance de socket.