web-dev-qa-db-ja.com

java.net.SocketException:使用可能なバッファスペースがありません(最大接続に達していますか?):接続

こんにちは、Apache HTTPクライアント4.0を使用して、HTTPSプロトコルに基づくサーバーにいくつかのファイルをアップロードしています。アップロードされたアプリケーションは24時間365日稼働しています。今日突然、それはこの例外を投げ始めました-

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

私の推測では、ポートが不足していて、問題はコードに直接関係しているのではなく、サーバーの現在の状態に関係しています。他のマシンに対して開かれている接続が多すぎるため、問題が発生します。

何を探すか:

  • サーバーの使用率が高く、複数のネットワーク接続が開かれる可能性がありますか?
  • HTTPクライアントのドキュメント は、HttpClientを1つだけインスタンス化し、このインスタンスを再利用することをお勧めします。それらは cases であり、複数のHTTPクライアントをインスタンス化して接続を正しく解放しないと、ネットワーク接続がスタックされ、決して閉じられません。 httpPost.releaseConnection()を試してください。 HTTPクライアントのドキュメントにも興味があるかもしれません 1.1.5章「低レベルのリソースのリリースを確実にする」
23
Vivien Barousse

サーバーには、リンクに続くいくつかの「エフェメラルポート」が定義されています: http://dbaktiar-on-Java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html = http://support.Microsoft.com/kb/196271

これは解決されました:上記の「ソケット不足」エラーの手順に従いました。

問題は2003サーバーに限定されています。

3
Nicu

サーバー(データベース/ HTTP)が接続を使い果たしたために発生する可能性があります。接続プールを使用するか、最大接続数を減らすと、この問題を解決できます。

1
kanaparthikiran

これは、Windowsのバージョンに応じて、一時的なポートまたはafd.sysのバグに関するWindowsの問題のようです。参照してください stackoverflowでの同様の質問に対する私の回答へ

1
Derek Bennett