【发布时间】:2015-04-27 21:47:14
【问题描述】:
当我将 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)
我没有发现我在发送请求时做错了什么。谁能指出缺少什么或我做错了什么
【问题讨论】:
-
基于 HTTPUrlConnection 的源,看起来它希望在连接打开之前调用这些方法(
setDoOutput和setRequestMethod),这应该'在您调用conn.connect()之前不会发生您的代码在结构上也类似于 URLConnection sample code -
@Chris 确切地说,我一直在挖掘 URLConnection 源代码以查看发生了什么,并且根本不应该发生错误。
-
嗯...我自己尝试这个我无法重现您的问题 - 我只是将它简化到足以将其放入独立的主要方法中,将 URL 硬编码为 docs.oracle.com,称为 @987654328 @ 并顺利通过
conn.setDoOutput / conn.setRequestMethod(在每一步都验证connected==false)-直到我打电话给conn.getOutputStream()它才被打开 -
我正在向同一台机器上的 tomcat 上托管的 Web 应用程序发送请求。这会导致问题吗?
-
只有当您的代码重用打开的
HttpURLConnection而不是每次都创建一个新的(根据您上面的代码)时,您才会遇到该问题。如果您像我一样将其简化为独立的主要方法,您是否能够重现您的问题?如果不是,那么您在此处运行的内容与该独立类之间显然存在一些差异,这应该有助于您调试它。