java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):connect

您好我使用Apache HTTP Client 4.0基于HTTPS协议上传服务器上的一些文件。 上传的应用程序全天候运行。 今天突然间它开始抛出这个exception –

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; } 

我的猜测:你的端口用完了,问题与你的代码没有直接关系,而是与你服务器的当前状态有关。 打开到其他计算机的连接太多,这会导致问题。

要找什么:

  • 您的服务器是否在大量使用中可能导致打开多个网络连接?
  • HTTP客户端文档建议仅实例化一个HttpClient用此实例。 它们是实例化多个HTTP客户端而不是正确释放连接的情况导致网络连接堆叠并且永远不会被关闭。 尝试httpPost.releaseConnection() 。 您可能还对HTTP客户端文档, 第1.1.5节“确保发布低级资源”感兴趣

服务器必须在链接之后定义几个“Ephemeral port”: http: //dbaktiar-on-java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html http:// support。 microsoft.com/kb/196271

这解决了:按照上面的步骤,“out of socket”错误消失了。

问题仅限于2003服务器。

可能是因为您的服务器(数据库/ Http)连接已耗尽。 使用连接池或减少最大连接可以解决此问题。

这似乎是一个Windows问题,无论是关于短暂的端口,还是关于afd.sys中的错误,具体取决于您的Windows版本。 请参阅我对stackoverflow上类似问题的回答