私は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:入力の読み取り後に出力を書き込むことができません。
コメント内のコードでURLをチェックしたが、残念ながらそれがなくても完全に機能する場合は、URLをチェックする必要があるので、問題はgetResponseCode
メソッドにあると思うが、解決方法がわからない
どうもありがとうございました
HTTPプロトコルは要求/応答パターンに基づいています。最初に要求を送信し、サーバーが応答します。サーバーが応答すると、それ以上コンテンツを送信できなくなり、意味がなくなります。 (サーバーはどのようにして応答コードを返すことができますかbefore送信しようとしているものを認識していますか?)
したがって、server.getResponseCode()
を呼び出すと、リクエストが終了し、処理できることをサーバーに効果的に伝えます。さらにデータを送信したい場合は、新しいリクエストを開始する必要があります。
コードを見て、接続自体が成功したかどうかを確認しますが、その必要はありません。接続が失敗した場合、Exception
がserver.connect()
によってスローされます。ただし、接続試行の結果は、サーバーがすべての入力を処理した後に必ず発生するHTTP応答コードと同じではありません。
例外は_printing url
_によるものではないと思います。応答が読み取られた後、要求の本文を設定するために記述しようとしているコードの一部があるはずです。
HttpURLConnection.getOutputStream()
を取得した後でHttpURLConnection.getInputStream()
を取得しようとすると、この例外が発生します
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;
}
}
_
私も同じ問題を抱えていました。問題の解決策は、シーケンスを使用する必要があることです
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);
...
私もこの問題を抱えています。驚いたのは、エラーが私の追加コード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();