java.net.SocketException: нет свободного места в буфере (достигнуто максимальное количество соединений?): соединение - PullRequest
12 голосов
/ 20 мая 2011

Привет! Я использую Apache HTTP Client 4.0 для загрузки некоторых файлов на сервер по протоколу HTTPS. Загруженное приложение работает круглосуточно. Сегодня вдруг это бросило это исключение -

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

Ответы [ 4 ]

22 голосов
/ 20 мая 2011

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

Что искать:

  • Ваш сервер интенсивно используется, что может привести к открытию нескольких сетевых подключений?
  • Клиентская документация HTTP рекомендует создать только один HttpClient и повторно использовать этот экземпляр. Это случаи , когда создание экземпляров нескольких клиентов HTTP и неправильное освобождение подключений приводит к тому, что сетевые подключения складываются и никогда не закрываются. Попробуйте httpPost.releaseConnection(). Вас также может заинтересовать документация по клиенту HTTP, глава 1.1.5, «Обеспечение высвобождения ресурсов низкого уровня»
2 голосов
/ 06 апреля 2015

Сервер имеет несколько «эфемерных портов», определенных следующим по ссылкам: http://dbaktiar -on-java.blogspot.ro / 2010/03 / Hudson-шоу-буфер пространство-available.html http://support.microsoft.com/kb/196271

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

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

1 голос
/ 17 апреля 2015

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

1 голос
/ 06 января 2013

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

...