Il existe 3 solutions :
1 Convenez de la longueur des données à envoyer. Par exemple, keepAlive de http doit s'appuyer sur cette Content-Length.
2 Définissez le délai d'attente. D'après mon expérience, il n'est efficace que s'il est défini au niveau du Socket.
Copiez le code comme suit : Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // S'il n'y a aucune donnée pendant plus de 100 millisecondes, lancez SocketTimeoutException
3. Une fois que l'expéditeur a fini d'envoyer les données, fermez la connexion. Ceci est très courant dans les opérations HTTP.
(Comment InputStream détermine-t-il que les données ont été lues)
Parfois, lorsque le client ne peut pas être modifié, la première situation ne fera que passer. La seconde situation est relativement plus adaptée. Lorsqu'elle est bloquée, une exception est levée directement. Le scénario 3 ne convient pas aux connexions longues car la liaison ne peut pas être interrompue pendant tout le processus de communication, ni être arrêtée complètement. En fait, il existe une quatrième méthode : lorsque certains caractères sont lus, arrêtez la lecture. Par exemple, lorsque byebye est lu, faites une pause. Mais cela nécessite aussi de changer le code client. J'ai choisi un compromis - définir un délai d'attente :
StringBuilder sb = new StringBuilder();try { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, a)); if (a != size) { break; } }} catch (Exception e) {}System.out.println(sb);