Согласно вашему коду, единственный раз, когда вы достигнете операторов, относящихся к отправке второго запроса, - это когда сервер закрывает выходной поток (ваш входной поток) после получения / ответа на первый запрос.
Причина в том, что ваш код должен читать только первый ответ
while((amountRead = isr_reader.read(streamBuf)) > 0) {
receivedData.append(streamBuf, 0, amountRead);
}
будет блокироваться до тех пор, пока сервер не закроет выходной поток (то есть, когда read
вернет -1
) или пока не истечет время ожидания чтения на сокете. В случае тайм-аута чтения будет выдано исключение, и вы даже не сможете отправить второй запрос.
Проблема с HTTP-ответами состоит в том, что они не сообщают вам, сколько байтов нужно прочитать из потока до конца ответа. Это не имеет большого значения для ответов HTTP 1.0, поскольку сервер просто закрывает соединение после ответа, что позволяет вам получить ответ (строка состояния + заголовки + тело), просто прочитав все до конца потока.
С постоянными соединениями HTTP 1.1 вы больше не можете просто читать все до конца потока. Сначала необходимо прочитать строку состояния и заголовки, построчно, а затем, основываясь на коде состояния, и заголовки (например, Content-Length) решают, сколько байтов нужно прочитать, чтобы получить тело ответа (если оно присутствует в все). Если вы сделаете все правильно, ваши операции чтения будут завершены до того, как соединение будет закрыто или произойдет тайм-аут, и вы прочтете именно тот ответ, который отправил сервер. Это позволит вам отправить следующий запрос и затем прочитать второй ответ точно так же, как и первый.
P.S. Запрос, запрос, чтение могут быть «работающими» в том смысле, что ваш сервер поддерживает конвейерную обработку запросов и, таким образом, получает и обрабатывает оба запроса, и в результате вы читаете оба ответа в один буфер как «первый» ответ.
P.P.S Убедитесь, что ваш PrintWriter
использует кодировку US-ASCII
. В противном случае, в зависимости от кодировки вашей системы, строка запроса и заголовки ваших HTTP-запросов могут быть неправильно сформированы (неправильная кодировка).