Es gibt 3 Lösungen:
1 Vereinbaren Sie die Länge der zu sendenden Daten. KeepAlive von http muss sich beispielsweise auf diese Content-Length verlassen.
2 Stellen Sie die Timeout-Zeit ein. Nach meiner Erfahrung ist sie nur wirksam, wenn sie auf Socket-Ebene eingestellt wird.
Kopieren Sie den Code wie folgt: Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // Wenn länger als 100 Millisekunden keine Daten vorhanden sind, wird eine SocketTimeoutException ausgelöst
3. Nachdem der Absender das Senden der Daten abgeschlossen hat, schließen Sie die Verbindung. Dies kommt bei HTTP-Vorgängen sehr häufig vor.
(Wie stellt InputStream fest, dass die Daten gelesen wurden)
Wenn der Client nicht geändert werden kann, ist die zweite Situation relativ geeignet. Wenn sie blockiert wird, wird direkt eine Ausnahme ausgelöst. Szenario 3 ist für lange Verbindungen nicht geeignet, da die Verbindung während des gesamten Kommunikationsvorgangs weder unterbrochen noch beendet werden kann. Tatsächlich gibt es eine vierte Methode: Wenn bestimmte Zeichen gelesen werden, unterbrechen Sie beispielsweise das Lesen. Dies erfordert jedoch auch eine Änderung des Client-Codes. Ich habe einen Kompromiss gewählt – das Festlegen einer Zeitüberschreitung:
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);