#java #inputstream
#java #входной поток
Вопрос:
Добрый день, я работаю над прокси, но один из входных потоков сокета ведет себя странно:
while(true) {
try {
while ((BytesRead = inputstream.read(Line)) != -1) {
OtherSocket.Write(Line, BytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
У меня почти то же самое для OtherSocket, но на этом он продолжает повторяться, как будто сервер продолжает отправлять данные, я предполагаю, что inputstream.read(строка) не ожидает ввода, а возвращает -1. Есть ли какая-либо причина, по которой inputstream.read(строка) не будет ждать ввода, как это было задумано?
Комментарии:
1. Это действительно Java? Это
OtherSocket
пользовательский класс?2. Если этот код написан на Java, он использует однотипный стиль написания, что затрудняет понимание кода.
Ответ №1:
Я полагаю InputStream.read
, что будет продолжать возвращать значение -1 после того, как сокет будет закрыт другим концом.
Почему вы хотите продолжать попытки чтения из потока, который уже вернул -1 из read
? Мне кажется, это ошибка. Если вы хотите сохранить while(true)
цикл, вы должны поместить break;
оператор после внутреннего цикла while, чтобы, если вам только что удалось нормально добраться до конца потока без проблем, вы могли просто выйти из внешнего цикла.
Я сильно подозреваю, что попытка чтения из потока после того, как он уже потерпел неудачу, тоже плохая идея, кстати.
(Я бы также посоветовал вам начать следовать более традиционным именованиям Java — очень странно видеть имена переменных PascalCase. Также странно видеть вызываемый метод Write
— это, конечно, не что-то на java.io.OutputStream
…)
Комментарии:
1. Что касается ответа Джона, вы не показываете нам, какую реализацию InputStream вы используете. Каждый из них определяет условия EOF. Нам нужно знать конкретную реализацию, чтобы быть более полезными.