title: android httpclient hangs on second request to the server (connection timed out)
body: <p>I'm struggling with the following problem:
  My App makes sequence of requests to the http server using HttpClient. I use HttpPut for sending data to the server.
  First request goes well and fast, second request hangs for 40 sec and then I catch Connection timed out exception. I'm trying to reuse my HttpClient and send second request through the same instance. If I create new HttpClient together with new ConnectionManager, then everything works fine.</p>
  
  <p>Why is this happening? And how to fix it and do not create new HttpClient each time?</p>
  
  <p>Thanks in advance.</p>
  
  <p>Here is my code: (if I comment readClient = newHttpClient(readClient) in doPut, then the problem arises.</p>
  
  <pre><code>public class WebTest
  {
  private HttpClient readClient;
  private SchemeRegistry httpreg;
  private HttpParams params;
  
  private URI url; //http://my_site.net/data/
  
  protected HttpClient newHttpClient(HttpClient oldClient)
  {
      if(oldClient != null)
          oldClient.getConnectionManager().shutdown();
  
      ClientConnectionManager cm = new SingleClientConnManager(params, httpreg);
      return new DefaultHttpClient(cm, params);
  }
  
  protected String doPut(String data)
  {
      //****************************
      //Every time we need to send data, we do new connection
      //with new ConnectionManager and close old one
      readClient = newHttpClient(readClient);
  
      //*****************************
  
  
      String responseS = null;
      HttpPut put = new HttpPut(url);
      try
      {
          HttpEntity entity = new StringEntity(data, "UTF-8");
          put.setEntity(entity);
          put.setHeader("Content-Type", "application/json; charset=utf-8");
          put.setHeader("Accept", "application/json");
          put.setHeader("User-Agent", "Apache-HttpClient/WebTest");
  
          responseS = readClient.execute(put, responseHandler);
      }
      catch(IOException exc)
      {
          //error handling here
      }
      return responseS;
  }
  
  public WebTest()
  {
      httpreg = new SchemeRegistry();
      Scheme sch = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80);
      httpreg.register(sch);
  
      params = new BasicHttpParams();
      ConnPerRoute perRoute = new ConnPerRouteBean(10);
      ConnManagerParams.setMaxConnectionsPerRoute(params, perRoute);
      ConnManagerParams.setMaxTotalConnections(params, 50);
      ConnManagerParams.setTimeout(params, 15000);
      int timeoutConnection = 15000;
      HttpConnectionParams.setConnectionTimeout(params, timeoutConnection);
      // Set the default socket timeout (SO_TIMEOUT) 
      // in milliseconds which is the timeout for waiting for data.
      int timeoutSocket = 40000;
      HttpConnectionParams.setSoTimeout(params, timeoutSocket);
  }
  
  private ResponseHandler&lt;String&gt; responseHandler = new ResponseHandler&lt;String&gt;() 
  {
      @Override
      public String handleResponse(HttpResponse response)
              throws ClientProtocolException, IOException
      {
          StatusLine statusLine = response.getStatusLine();
          if (statusLine.getStatusCode() &gt;= 300) 
          {
              throw new HttpResponseException(statusLine.getStatusCode(),
                      statusLine.getReasonPhrase());
          }
  
          HttpEntity entity = response.getEntity();
          if(entity == null)
              return null;
  
          InputStream instream = entity.getContent();
          return this.toString(entity, instream, "UTF-8");
      }
  
      public String toString(
              final HttpEntity entity, 
              final InputStream instream, 
              final String defaultCharset) throws IOException, ParseException 
      {
          if (entity == null) 
          {
              throw new IllegalArgumentException("HTTP entity may not be null");
          }
  
          if (instream == null) 
          {
              return null;
          }
          if (entity.getContentLength() &gt; Integer.MAX_VALUE) 
          {
              throw new IllegalArgumentException("HTTP entity too large to be buffered in memory");
          }
          int i = (int)entity.getContentLength();
          if (i &lt; 0) 
          {
              i = 4096;
          }
          String charset = EntityUtils.getContentCharSet(entity);
          if (charset == null) 
          {
              charset = defaultCharset;
          }
          if (charset == null) 
          {
              charset = HTTP.DEFAULT_CONTENT_CHARSET;
          }
  
          Reader reader = new InputStreamReader(instream, charset);
  
          StringBuilder buffer=new StringBuilder(i);
          try 
          {
              char[] tmp = new char[1024];
              int l;
              while((l = reader.read(tmp)) != -1) 
              {
                  buffer.append(tmp, 0, l);
              }
          } finally 
          {
              reader.close();
          }
  
          return buffer.toString();
      }
  }; 
  </code></pre>
  
  <p>}</p>