web-dev-qa-db-fra.com

java.net.SocketException: Aucun espace tampon disponible (nombre maximum de connexions atteint?): connect

Salut, j'utilise Apache HTTP Client 4.0 pour télécharger des fichiers sur un serveur basé sur le protocole HTTPS. L'application téléchargée fonctionne 24h/24 et 7j/7. Aujourd'hui, tout à coup, il a commencé à jeter cette 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)

Est-ce que quelqu'un peut m'aider s'il vous plait? Je ne sais absolument pas ce qui se passe?

Ceci est le code source qui télécharge le fichier -

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

Ma conjecture: vous manquez de ports et le problème n'est pas directement lié à votre code mais à l'état actuel de votre serveur. Trop de connexions sont ouvertes vers d'autres machines et cela provoque le problème.

Ce qu'il faut chercher:

  • Votre serveur est-il soumis à une utilisation intensive pouvant entraîner l'ouverture de plusieurs connexions réseau?
  • documentation client HTTP recommande d'instancier un seul HttpClient et de réutiliser cette instance. Ce sont cas où l'instanciation de plusieurs clients HTTP et la non-libération correcte des connexions entraînent l'empilement et la fermeture des connexions réseau. Essayez de httpPost.releaseConnection(). Vous pourriez également être intéressé par la documentation du client HTTP, chapitre 1.1.5, "Assurer la libération des ressources de bas niveau"
23
Vivien Barousse

Le serveur a peu de "port éphémère" défini comme suit pour les liens: http://dbaktiar-on-Java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html = http://support.Microsoft.com/kb/196271

Ceci est résolu: suivi les étapes ci-dessus, une erreur "out of sockets" a disparu.

Le problème est limité au serveur 2003.

3
Nicu

Peut se produire car votre serveur (base de données/Http) est épuisé de connexions. Utiliser un pool de connexions ou réduire le nombre maximal de connexions peut résoudre ce problème.

1
kanaparthikiran

Cela semble être un problème Windows, soit sur les ports éphémères, soit sur un bogue dans afd.sys, selon votre version de Windows. Veuillez vous référer à ma réponse à une question similaire sur stackoverflow

1
Derek Bennett