Мой вопрос связан с методом InputStream.read() - программирование сокетов.Android: Насколько надежным является InputStream.read() и его «-1» возврат?
Каждый найденный источник утверждает, что когда сервер или клиент закрывают соединение, возвращается «-1».
Но, «что если», просто говоря, «что, если» соединение будет закрыт, но чтения() не возвращает «-1»? Мы полагаемся на чужой код. Причина, по которой я волнуюсь, состоит в том, что для того, чтобы читать вход удаленного конца, нужно создать бесконечный цикл, и мне всегда казалось, что он должен держаться подальше от бесконечных циклов. С Java, однако, похоже, что у меня нет выбора! Вот пример:
int b = 0;
while (true)
{
b = inputStream.read()
if (b == -1) break; // connection closed
}
или
while (b > -1)
b = inputStream.read()
Что если что-то происходит, и -1 никогда не станет правдой? Один из них закончится бесконечным циклом, повышающим температуру чьего-то устройства и потерявшим процессорные циклы! Как можно быть уверенным?
Литература: [http://developer.android.com/reference/java/io/InputStream.html#read%28%29][1] и [http://docs.oracle.com/javase/ 6/docs/api/java/io/InputStream.html # read% 28byte [],% 20int,% 20int% 29] [2]
Я хочу иметь отказоустойчивую проверку. То, что я сделал в цикле, также проверяет, стал ли сокет равным нулю, и если да, то разрыв цикла.
while (b > -1)
{
b = inputStream.read()
if (socket == null) break;
if (outputStream == null) break;
}
Что еще я могу сделать, чтобы обеспечить существование цикла в случае, если «-1» никогда не становится истинным?
* «Мы полагаемся на чей-то код». * Каждый раз, когда вы программируете какую-либо систему, на которой вы не писали BIOS, вы полагаетесь на чей-то код. (Черт, даже если вы написали BIOS, все еще есть микрокод процессора.) –
Когда вы говорите о программировании сокета. Будет время ожидания сокета. Который можно использовать для остановки бесконечных циклов. –
По крайней мере, вы можете положиться на 'IOException'. –