java.net.SocketException: нет доступного места в буфере (достигнуто максимальное количество подключений?): подключиться

Привет, я использую 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;
    }

person user381878    schedule 20.05.2011    source источник
comment
Microsoft Windows Server 2003, 32-битная машина   -  person user381878    schedule 20.05.2011
comment
Еще один информационный журнал показал, что это исключение выбрасывалось 16 раз, так как основная программа вызывает эту программу загрузки каждый час. В 17 раз возникло новое исключение: java.net.BindException: Адрес уже используется: подключение   -  person user381878    schedule 20.05.2011


Ответы (5)


Мое предположение: у вас заканчиваются порты, и проблема напрямую связана не с вашим кодом, а с текущим состоянием вашего сервера. Слишком много соединений открыто с другими машинами, и это вызывает проблему.

Что искать:

  • Ваш сервер интенсивно используется, что может привести к открытию нескольких сетевых подключений?
  • В документации HTTP-клиента рекомендуется создавать только один экземпляр HttpClient и повторно использовать этот экземпляр. . Это случаи, когда создание экземпляров нескольких HTTP-клиентов и неправильное освобождение соединений приводит к тому, что сетевые соединения складываются в стек и никогда не закрываются. . Попробуйте httpPost.releaseConnection(). Вас также может заинтересовать документация по HTTP-клиенту, глава 1.1. .5, "Обеспечение высвобождения низкоуровневых ресурсов"
person Vivien Barousse    schedule 20.05.2011
comment
Привет, пользователь 381878. Если это помогло вам, не могли бы вы объяснить, где на самом деле вы настроили конфигурацию на сервере? или вы где-то использовали - httpPost.releaseConnection(). - person Vikas Kumar; 27.08.2017

Сервер имеет несколько «Эфемерных портов», определенных для следующих ссылок: rel="nofollow">http://dbaktiar-on-java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html http://support.microsoft.com/kb/196271

Это решено: выполнили шаги, описанные выше, и ошибки «вне сокетов» исчезли.

Проблема ограничена сервером 2003.

person Nicu    schedule 06.04.2015
comment
Ваш ответ - это просто ссылка на ответ; если эта ссылка изменится, ответ станет неактуальным. Пожалуйста, разместите здесь любой соответствующий код/документацию, чтобы сделать ответ правильным. - person rfornal; 06.04.2015
comment
Ссылка на базу знаний следует считаться постоянной. Это правильный ответ для Windows Server 2003. В Windows Server 2008 R2 и R2 SP1 есть связанная проблема. Я собрал всю информацию в исчерпывающий ответ на другой вопрос stackoverflow, ссылку на который я разместил в этой теме. - person Derek Bennett; 17.04.2015

Может произойти из-за того, что на вашем сервере (базе данных/Http) исчерпаны соединения. Используйте пул соединений или уменьшите максимальное количество соединений, чтобы решить эту проблему.

person kanaparthikiran    schedule 06.01.2013

Похоже, это проблема Windows, связанная либо с эфемерными портами, либо с ошибкой в ​​afd.sys, в зависимости от вашей версии Windows. Пожалуйста, обратитесь к моему ответу на аналогичный вопрос в stackoverflow

person Derek Bennett    schedule 17.04.2015
comment
Наличие одинаковых симптомов не означает, что у вас одна и та же причина. Причина этого типа проблемы зависит от ОС и версии ОС. Это конкретное происшествие произошло в 32-разрядной версии Windows Server 2003, причина и устранение которой, как указано выше, хорошо задокументированы. - person Derek Bennett; 09.03.2016
comment
Никогда не было этой проблемы на OSX, на Windows довольно часто. PS: я не фанат яблока, их клееные батареи не мой выбор, но я люблю ОС за ее стабильность и надежность. - person Martin Pfeffer; 04.05.2017

На моем сервере Windows2008 возникла та же проблема несколько дней назад, я не смог быстро решить эту проблему с помощью кодирования, а затем я перезагрузил свой сервер, проблема исчезла, это эээ.

person JessenGan    schedule 01.07.2021