我想在一个HTTP连接中进行多个post调用,
Arraylist<String>
和httpConnection
个对象作为输入参数。ArrayList
并将请求写入服务器。我最终收到以下错误:
Cannot write output after reading input.
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
这是我的代码。我用来完成上述任务。
public boolean sendToLogsAPI(ArrayList<String> logList, HttpURLConnection conn) throws IOException
{
try
{
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
for(int i=0; i<logList.size(); i++)
{
wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(logList.get(i));
wr.flush();
int nothing = conn.getResponseCode();
String morenothing = conn.getResponseMessage();
}
wr.flush();
wr.close();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if(conn != null)
{
conn.disconnect();
}
}
return false;
}
我如何克服这种情况?
答案 0 :(得分:2)
根据HttpURLConnection
:
每个HttpURLConnection实例用于发出单个请求
有关详细信息,请参阅this。
问题是,您完成conn.getOutputStream()
后无法执行wr.flush()
。
如果要发送其他帖子请求,则必须创建HttpURLConnection
的新实例。您可以通过多种方式完成此操作。一种方法是创建一个方法getHttpURLConnection()
,每次都提供新的连接[如果你展示如何创建HttpURLConnection
的实例,并将其传递给方法sendToLogsAPI()
,那么我可以告诉你getHttpURLConnection()
的实现也是如此。]并修改现有代码如下:
public boolean sendToLogsAPI(ArrayList<String> logList) throws IOException
{
DataOutputStream wr = null;
HttpURLConnection conn = null;
try
{
for(int i=0; i<logList.size(); i++)
{
conn = conn("<Some-URL>","<API-Key>","<GUID>");
wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(logList.get(i));
wr.flush();
int nothing = conn.getResponseCode();
String morenothing = conn.getResponseMessage();
}
if(wr != null) {
wr.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if(conn != null)
{
conn.disconnect();
}
}
return false;
}
我想问你的另一个问题是你为什么要使用相同的HttpURLConnection
实例。即使您使用多个,也可以使用相同的Socket
(和底层TCP)。因此,请不要担心HttpURLConnection
的多个实例。
答案 1 :(得分:0)
您正在使用此方法关闭连接,因此无法使用相同的HttpURLConnection conn
您可能不应断开此处的连接conn.disconnect();
,而是将其留给来电者。