Невозможно записать вывод после прочтения ввода

Я пишу программу, которая подключается к сервлету благодаряHttpURLConnection но я застрял при проверке URL

public void connect (String method) throws Exception {

server = (HttpURLConnection) url.openConnection ();
server.setDoInput (true);
server.setDoOutput (true);
server.setUseCaches (false);
server.setRequestMethod (method);
server.setRequestProperty ("Content-Type", "application / xml");

server.connect ();

/*if (server.getResponseCode () == 200)
{
System.out.println ("Connection OK at the url:" + url);
System.out.println ("------------------------------------------- ------- ");
}
else
System.out.println ("Connection failed"); 

}*/

Я получил ошибку:

java.net.ProtocolException: Cannot write output after reading input.

если я проверяю URL с кодом в комментариях, но он прекрасно работает без него к сожалению, мне нужно проверить URL, поэтому я думаю, что проблема исходит отgetResponseCode метод, но я не знаю, как решить его

большое спасибо

Ответы на вопрос(4)

printing url, Должен быть какой-то фрагмент кода, который пытается написать, чтобы установить тело запроса после прочтения ответа.

Это исключение произойдет, если вы пытаетесь получитьHttpURLConnection.getOutputStream() после полученияHttpURLConnection.getInputStream()

Here is the implentation of sun.net.www.protocol.http.HttpURLConnection.getOutputStream:

public synchronized OutputStream getOutputStream() throws IOException {

     try {
         if (!doOutput) {
             throw new ProtocolException("cannot write to a URLConnection"
                            + " if doOutput=false - call setDoOutput(true)");
         }

         if (method.equals("GET")) {
             method = "POST"; // Backward compatibility
         }
         if (!"POST".equals(method) && !"PUT".equals(method) &&
             "http".equals(url.getProtocol())) {
             throw new ProtocolException("HTTP method " + method +
                                         " doesn't support output");
         }

         // if there's already an input stream open, throw an exception
         if (inputStream != null) {
             throw new ProtocolException("Cannot write output after reading 
                input.");
         }

         if (!checkReuseConnection())
             connect();

         /* REMIND: This exists to fix the HttpsURLConnection subclass.
          * Hotjava needs to run on JDK.FCS.  Do proper fix in subclass
          * for . and remove this.
          */

         if (streaming() && strOutputStream == null) {
             writeRequests();
         }
         ps = (PrintStream)http.getOutputStream();
         if (streaming()) {
             if (strOutputStream == null) {
                 if (fixedContentLength != -) {
                     strOutputStream = 
                        new StreamingOutputStream (ps, fixedContentLength);
                 } else if (chunkLength != -) {
                     strOutputStream = new StreamingOutputStream(
                         new ChunkedOutputStream (ps, chunkLength), -);
                 }
             }
             return strOutputStream;
         } else {
             if (poster == null) {
                 poster = new PosterOutputStream();
             }
             return poster;
         }
     } catch (RuntimeException e) {
         disconnectInternal();
         throw e;
     } catch (IOException e) {
         disconnectInternal();
         throw e;
     }
 }
 ulquiorra10 июл. 2012 г., 14:29
Спасибо за помощь. Действительно, мое исключение было выдано для: BufferedWriter wr = new BufferedWriter (new OutputStreamWriter (server.getOutputStream (), & quot; UTF-8 & quot;)); но мой класс очень длинный, поэтому я решил оставить в комментарии только основную проблему с кодом.
 10 июл. 2012 г., 14:30
Да, вы можете сделать это только до получения server.getInputStream (). Вы не можете сделать это после этого.

Решение проблемы заключается в том, что вам нужно использовать последовательность

openConnection -> getOutputStream -> write -> getInputStream -> read

Это означает..:

public String sendReceive(String url, String toSend) {
URL url = new URL(url);
URLConnection conn = url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.sets...

OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
out.write(toSend);
out.close();

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String receive = "";
do {
    String line = in.readLine();
    if (line == null)
        break;
    receive += line;
} while (true);
in.close();

return receive;
}

String results1 = sendReceive("site.com/update.php", params1);
String results2 = sendReceive("site.com/update.php", params2);
...
Решение Вопроса

сначала вы отправляете запрос, а сервер отвечает. Как только сервер ответил, вы не можете отправлять больше контента, это не имеет смысла. (Как сервер может дать вам код ответаbefore он знает, что вы пытаетесь отправить?)

Поэтому, когда вы звонитеserver.getResponseCode()вы фактически сообщаете серверу, что ваш запрос завершен, и он может его обработать. Если вы хотите отправить больше данных, вы должны начать новый запрос.

Просматривая свой код, вы хотите проверить, было ли само соединение успешным, но в этом нет необходимости: если соединение не было успешным,Exception брошенserver.connect(), Но результат попытки соединения не совпадает с кодом ответа HTTP, который всегда приходит после того, как сервер обработал все ваши входные данные.

 ulquiorra10 июл. 2012 г., 14:28
Большое спасибо. На самом деле, я сделал недоразумение между контролем соединения и контролем ответа HTTP. Я переключил это на попытку поймать, и это работает лучше, большое спасибо
 03 дек. 2015 г., 03:44
но сервер может ответить ошибка, прежде чем я закончу сообщение. как прочитать ранний ответ с HttpURLConnection?
 28 нояб. 2016 г., 20:36
@ulquiorra Я думаю, что я испытываю эту проблему. EстьgetResponseCode() с последующимgetOutputStream();, Согласитесь ли вы, что это вызоветCannot write output after reading input?

меня удивляет то, что ошибка вызвана моим добавленным кодомSystem.out.println(conn.getHeaderFields());

Ниже мой код:

HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
configureConnection(conn);
//System.out.println(conn.getHeaderFields()); //if i comment this code,everything is ok, if not the 'Cannot write output after reading input' error happens
conn.connect();
OutputStream os = conn.getOutputStream();
os.write(paramsContent.getBytes());
os.flush();
os.close();

Ваш ответ на вопрос