Есть 3 решения:
1 Согласуйте длину отправляемых данных. Например, KeepAlive HTTP должен полагаться на эту длину контента.
2 Установите время тайм-аута. По моему опыту, оно эффективно только в том случае, если оно установлено на уровне сокета.
Скопируйте код следующим образом: Socketocket = new Socket(host,port);
Socket.setSoTimeout(100); // Если данных нет более 100 миллисекунд, выбрасываем SocketTimeoutException
3. После того, как отправитель завершил отправку данных, закройте соединение. Это очень распространено в операциях HTTP.
(Как InputStream определяет, что данные прочитаны)
Иногда, когда клиент не может быть изменен, пройдет только первая ситуация. Вторая ситуация является относительно более подходящей. При блокировке автоматически генерируется исключение. Сценарий 3 не подходит для длинных соединений, поскольку соединение не может быть прервано в течение всего процесса связи или отключено для завершения. На самом деле есть четвертый способ: когда прочитаны определенные символы, прекратить чтение. Например, когда прочитано «прощай», прерваться. Но это также требует изменения клиентского кода. Я выбрал компромисс — установку таймаута:
StringBuilder sb = new StringBuilder(); try { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, а)); if (a != size) {break; } }} catch (Исключение e) {}System.out.println(sb);