2011-05-20 53 views
12

您好我正在使用Apache HTTP客戶端4.0上基於HTTPS協議的服務器上的某些文件。上傳的應用程序全天候運行。今天突然它開始拋出這個異常 -java.net.SocketException:沒有可用的緩衝區空間(達到最大連接數?):connect

java.net.SocketException: No buffer space available (maximum connections reached?): connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:333) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123) 
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147) 
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:101) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:381) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554) 

任何人都可以請幫助我嗎?我對發生的事情完全無能爲力?

這是上傳文件的源代碼 -

public File call() throws Exception {   
      HttpClient httpclient = new DefaultHttpClient(); 
     try{    
      httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);   
      /* 
      * Create POST REQUEST 
      */ 
      HttpPost httpPost = new HttpPost(this.URL); 
      /* 
      * Create MultipartRequestEntity 
      */ 
      MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
      /* 
      * Add POST Parameters 
      */ 
      multipartEntity.addPart(parameters[0], this.fileBody); 
      multipartEntity.addPart(parameters[1], new StringBody(this.TYPE)); 
      multipartEntity.addPart(parameters[2], new StringBody(this.MAAID)); 
      /* 
      * Add this POST Method 
      */ 
      httpPost.setEntity(multipartEntity); 
      /* 
      * Upload the file 
      */ 
      HttpResponse response = httpclient.execute(httpPost); 
      int responseCode = response.getStatusLine().getStatusCode(); 
      logger.info("Response Code of HTTP Connectivity ["+ responseCode + "], " + 
                  "it means ["+ response.getStatusLine().getReasonPhrase()+"]"); 
      /* 
      * Check the server Response 
      */ 
      HttpEntity entity = response.getEntity(); 
      if(entity != null){ 
       String status = EntityUtils.toString(entity); 
       logger.info("Status of file upload from Server >>"+ status+"<<"); 
       entity.consumeContent(); 
       if(status.equalsIgnoreCase("OK")){ 
        return this.fileBody.getFile(); 
       } 
      }else{ 
       logger.error("Unable to retrieve status of file upload from server"); 
      }   
     }catch(NoRouteToHostException e){ 
      logger.error("Internet connection to ["+ this.URL + "] is not available", e); 
     }catch(SocketException e){ 
      logger.error("Unable to connect to "+ this.URL, e); 
     }catch (Exception e) {   
      logger.error("Exception while uploading the file["+ this.fileBody.getFilename()+ "] on ["+ this.URL+"]", e); 
     }finally{ 
      try{ 
       httpclient.getConnectionManager().shutdown(); 
      }catch(Exception e){ 
       // Ignore this exception 
      } 
     } 
     return null; 
    } 
+1

這是什麼操作系統? – Jacob 2011-05-20 06:54:31

+0

微軟Windows Server 2003,32位機器 – user381878 2011-05-20 07:05:11

+0

一個額外的信息- 日誌顯示,這個異常被拋出16次,因爲主程序每個小時都會調用這個上傳程序。第17次,它拋出了一個新的異常: java.net.BindException:地址已在使用中:connect – user381878 2011-05-20 07:07:04

回答

20

我的猜測:你正在運行的輸出端口和問題不直接關係到你的代碼,但您的服務器的當前狀態。太多的連接打開到其他機器,這會導致問題。

查找內容:

  • 是大量使用下的服務器,可能導致多個網絡連接被打開?
  • HTTP client documentation建議僅實例化一個HttpClient並重新使用此實例。它們是cases,其中實例化多個HTTP客戶端並且沒有正確釋放連接會導致網絡連接堆疊並永遠不會關閉。嘗試httpPost.releaseConnection()。您可能也對HTTP客戶端文檔感興趣,chapter 1.1.5, "Ensuring release of low level resources"
+0

謝謝。你的建議工作。 – user381878 2011-05-24 06:48:52

+0

嗨user381878,如果這對你有幫助,你能解釋一下你在服務器上做了哪些配置嗎?或者你在什麼地方使用httpPost.releaseConnection()。 – 2017-08-27 17:13:30

1

可能因爲您的服務器(數據庫/ Http)用盡了連接。使用連接池或減少最大連接可以解決此問題。

1

服務器具有幾個「臨時端口」定義SE以下鏈接到: http://dbaktiar-on-java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html http://support.microsoft.com/kb/196271

這是解決:按照上面的「出插座」的錯誤都不見了的步驟。

問題僅限於2003服務器。

+3

你的答案只是一個答案的鏈接;如果這個鏈接發生變化,答案變得無關緊要。請在此發佈任何相關的代碼/文檔以使答案正確。 – rfornal 2015-04-06 14:45:51

+0

KB鏈接_應該被信任爲永久的。這是Windows Server 2003的正確答案。Windows Server 2008 R2和R2 SP1中存在相關的問題。我收集了所有的信息到一個不同的stackoverflow問題的綜合答案,我發佈了一個鏈接到這個線程。 – 2015-04-17 14:55:47

1

這似乎是Windows問題,或者是關於短暫端口,或者是關於afd.sys中的錯誤,具體取決於您的Windows版本。 請參考to my answer to a similar question on stackoverflow

+0

不行,我們在Linux和PostgreSQL上也有同樣的問題 – 2016-02-25 10:21:30

+0

有相同的症狀並不意味着你有同樣的原因。遇到這種問題,根據操作系統和操作系統版本的不同,原因有所不同。如上所述,這種特殊情況發生在Windows Server 2003 32位上,其原因和治療方法都有詳細記錄。 – 2016-03-09 14:59:31

+0

從來沒有在osx上的這個問題,在窗戶相當頻繁。 PS:我不是蘋果迷,他們的粘膠電池不是我的選擇,但我喜歡操作系統的穩定性和可靠性。 – 2017-05-04 08:54:06

相關問題