Java.net.SocketException: нет свободного места в буфере (достигнуто максимальное количество подключений?): connect
Привет, я использую Apache HTTP Client 4.0 для загрузки некоторых файлов на сервере на основе протокола HTTPS. Загруженное приложение работает 24x7. Сегодня неожиданно он начал бросать это исключение -
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
Мое предположение: у вас закончились порты, и проблема не связана напрямую с вашим кодом, а с текущим состоянием вашего сервера. Слишком много соединений открываются другим машинам, и это вызывает проблему.
Что искать:
- Неужели ваш сервер находится под большим использованием, что может привести к открытию нескольких сетевых подключений?
- Документация клиента HTTP рекомендует создать экземпляр только одного
HttpClient
и повторно использовать этот экземпляр. Они случаи, где копирование нескольких HTTP-клиентов и не отключение соединений правильно заставляет сетевые подключения стекаться и никогда не закрываться. Попробуйте httpPost.releaseConnection()
. Вы также можете быть заинтересованы в документации по HTTP-клиенту, глава 1.1.5, "Обеспечение выпуска ресурсов низкого уровня"
Ответ 2
Может случиться, что ваш сервер (база данных /Http ) исчерпан из соединений. Использование пула соединений или сокращение максимальных подключений может решить эту проблему.
Ответ 3
На сервере должно быть несколько "Эфемерный порт", определенный следующим образом:
http://dbaktiar-on-java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html
http://support.microsoft.com/kb/196271
Это решено: последовали шаги, описанные выше, из-за ошибок "из сокетов".
Проблема ограничена сервером 2003.
Ответ 4
Это, по-видимому, проблема Windows, или о эфемерных портах, или об ошибке в файле afd.sys, в зависимости от вашей версии Windows.
Пожалуйста, обратитесь fooobar.com/info/431273/...