解決策は 3 つあります。
1 送信するデータの長さに同意します。たとえば、http の keepAlive はこの Content-Length に依存する必要があります。
2 タイムアウト時間を設定します。私の経験によれば、ソケット レベルで設定した場合にのみ有効です。
次のようにコードをコピーします。 Socket ソケット = new Socket(host,port);
ソケット.setSoTimeout(100); // 100 ミリ秒を超えてデータがない場合は、SocketTimeoutException をスローします。
3. 送信者がデータの送信を完了したら、接続を閉じます。 これは HTTP 操作では非常に一般的です。
(InputStream はデータが読み取られたことをどのように判断するのか)
場合によっては、クライアントを変更できない場合は、最初の状況のみが通過し、ブロックされた場合は、例外が直接スローされます。シナリオ 3 は、通信プロセス全体でリンクを中断したり、シャットダウンして終了したりすることができないため、長時間の接続には適していません。実際には、4 番目の方法があります。つまり、特定の文字が読み取られたときに読み取りを停止します。たとえば、byebye が読み取られたときに中断します。ただし、これにはクライアント コードの変更も必要です。私は妥協策としてタイムアウトを設定することを選択しました。
StringBuilder sb = new StringBuilder();try { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, a)); if (a != サイズ) { ブレーク; } }} catch (例外 e) {}System.out.println(sb);