"Незаконное исключение штата: уже подключено" при использовании HttpURLConnection
Я получаю исключение незаконного состояния, когда я устанавливаю DoOutput в true.
public boolean sendLinksToMaster(String ipport, List<String> links){
boolean sent = false;
String[] tokens = ipport.split(":");
String data = edu.cis555.searchengine.utils.Utils.generateLinks(links);
HttpURLConnection conn=null;
try{
String encodedData = URLEncoder.encode(data, "UTF-8");
try{
String ip =tokens[0];
String port = tokens[1];
String path = edu.cis555.searchengine.utils.Constants.URL_ADD_LINK;
System.setProperty("http.keepAlive", "false");
URL u = new URL("http", ip, Integer.parseInt(port),"/"+path);
conn = (HttpURLConnection)u.openConnection();
//ERROR IN THIS LINE
conn.setDoOutput(true);
conn.setRequestMethod("POST");
OutputStream stream = conn.getOutputStream();
stream.write(encodedData.getBytes());
stream.close();
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK)
sent=true;
// LOG.debug(conn.getResponseCode());
conn.disconnect();
}catch(MalformedURLException mfe){
LOG.debug(mfe.getMessage());
if(conn!=null){
conn.disconnect();
}
}catch(IOException ioe){
LOG.debug(ioe.getMessage());
if(conn!=null){
conn.disconnect();
}
}
}catch(Exception e){
LOG.debug(e.getMessage());
if(conn!=null){
conn.disconnect();
}
}
return sent;
}
Трассировка стека, отображаемая для нее:
java.lang.IllegalStateException: Already connected
at java.net.URLConnection.setDoOutput(Unknown Source)
at edu.upenn.cis455.xpathengine.utils.pool.ThreadPool.sendLinksToMaster(ThreadPool.java:357)
at edu.upenn.cis455.xpathengine.utils.pool.ThreadPool$Worker.processAndAddToQueue(ThreadPool.java:314)
at edu.upenn.cis455.xpathengine.utils.pool.ThreadPool$Worker.run(ThreadPool.java:269)
at java.lang.Thread.run(Unknown Source)
Я не вижу ничего, что я делаю неправильно, отправляя запрос. Может ли кто-нибудь указать, что отсутствует или что я делаю неправильно?
Ответы
Ответ 1
У меня возникла такая же проблема и она была решена. В моем случае это было вызвано тем, что в моем интерфейсе отладки в NetBeans у меня была забытая часовая версия connection.getResponseCode()
. Надеюсь, это поможет другим сделать ту же ошибку.
Если у вас есть часы относительно значения ответа запроса, такие как getResponseCode()
, getResponseMessage()
, getInputStream()
или даже просто connect()
, вы получите эту ошибку в режиме отладки.
Все предыдущие методы неявно называют connect()
и запускают запрос. Поэтому, когда вы достигнете setDoOutput
, соединение уже выполнено.
Ответ 2
иногда это так же просто, как убедиться, что у вас нет http вместо https.
Ответ 3
Помимо часов, упомянутых в предыдущем комментарии, это может также произойти, если что-то не так с соединением. Например:
Я устанавливал свойство: post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
после записи в OutPut Stream, например post.getOutputStream().write(jsonBody.getBytes("UTF-8"));
Это было похоже на:
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
В этом случае я также получал сообщение "Уже подключен". Чтобы исправить это, я сделал это так:
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
Ответ 4
поставьте stream.close();
в последнем блоке