我想在一个HTTP连接中进行多个帖子调用,


我将发送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;
}


我该如何克服这种情况?

最佳答案

根据HttpURLConnection的javadoc:


  每个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的多个实例。

关于java - HttpUrlConnection在单个连接中发送多个发布请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39539975/

10-12 19:34