"Illegal State Exception: Already Connected" 使用 HttpURLConnection 时
"Illegal State Exception: Already Connected" when using 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)
我没有发现发送请求有任何问题。谁能指出遗漏了什么或我做错了什么
把stream.close();
在最后块
我遇到了同样的问题并解决了。就我而言,这是因为我在 NetBeans 的调试界面中忘记了对 connection.getResponseCode()
的监视。希望它能帮助其他犯同样错误的人。
如果你有任何与请求的响应值相关的手表,例如 getResponseCode()
、getResponseMessage()
、getInputStream()
甚至只是 connect()
,你将得到在调试模式下出现此错误。
之前的所有方法都隐式调用 connect()
并触发请求。因此,当您到达 setDoOutput
时,连接已经建立。
有时只要确保您没有使用 http 而不是 https 即可。
除了之前评论提到的watch外,连接有问题也有可能出现。例如:
我设置了 属性:post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
写入输出流后 post.getOutputStream().write(jsonBody.getBytes("UTF-8"));
就像:
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
在这种情况下,我也得到了 "Already Connected"。为了修复它,我把它改成了:
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
当我将 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)
我没有发现发送请求有任何问题。谁能指出遗漏了什么或我做错了什么
把stream.close(); 在最后块
我遇到了同样的问题并解决了。就我而言,这是因为我在 NetBeans 的调试界面中忘记了对 connection.getResponseCode()
的监视。希望它能帮助其他犯同样错误的人。
如果你有任何与请求的响应值相关的手表,例如 getResponseCode()
、getResponseMessage()
、getInputStream()
甚至只是 connect()
,你将得到在调试模式下出现此错误。
之前的所有方法都隐式调用 connect()
并触发请求。因此,当您到达 setDoOutput
时,连接已经建立。
有时只要确保您没有使用 http 而不是 https 即可。
除了之前评论提到的watch外,连接有问题也有可能出现。例如:
我设置了 属性:post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
写入输出流后 post.getOutputStream().write(jsonBody.getBytes("UTF-8"));
就像:
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
在这种情况下,我也得到了 "Already Connected"。为了修复它,我把它改成了:
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))