Чтение данных из Http-ответа редко вызывает BindException: адрес уже используется

1

Я использую следующий код для чтения HTTP-запроса формы данных. В общем случае он работает хорошо, но некоторое время "httpURLConnection.getResponseCode()" бросает java.net.BindException: адрес уже используется: connect

     ............
     URL url = new URL( strUrl );
     httpURLConnection = (HttpURLConnection)url.openConnection();
     int responseCode = httpURLConnection.getResponseCode();
     char charData[] = new char[HTTP_READ_BLOCK_SIZE];
     isrData = new InputStreamReader( httpURLConnection.getInputStream(), strCharset );
     int iSize = isrData.read( charData, 0, HTTP_READ_BLOCK_SIZE );
     while( iSize > 0 ){
            sbData.append( charData, 0, iSize );
            iSize = isrData.read( charData, 0, HTTP_READ_BLOCK_SIZE );
     }
     .................





 finally{
            try{
                if( null != isrData ){
                    isrData.close();
                    isrData = null;
                }

                if( null != httpURLConnection ){
                    httpURLConnection.disconnect();
                    httpURLConnection = null;
                }

                strData = sbData.toString();
             }
            catch( Exception e2 ){
            }

Код, запущенный на Java 1.6, Tomcat 6. Спасибо вам

Теги:
http
tomcat6

2 ответа

2
Лучший ответ

Избавьтесь от disconnect() и закройте Reader. У вас закончились локальные порты, и использование disconnect() отключает пул соединений HTTP-соединений, что является решением этого.

  • 0
    Хороший вопрос, к сожалению, это не помогло, я все еще сею Исключение в файлах журнала с той же периодичностью.
  • 0
    Тогда тебе нужен сон. У вас заканчиваются исходящие порты, то есть все они используются в течение периода TIME_WAIT.
1

После полного чтения потока вам нужно close() Reader. Это освободит основные ресурсы (сокеты и т.д.) Для последующего повторного использования. В противном случае система будет исчерпана.

Основная идиома Java IO для вашего случая следующая:

Reader reader = null;
try {
    reader = new InputStreamReader(connection.getInputStream(), charset);
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

См. также:

  • 0
    Все закрыто. Эта проблема решена путем добавления Thread.sleep (500), но мне не нравится это решение.
  • 0
    Вы уже близкие ресурсы? Если вы этого не сделали и исправили код, то вам необходимо перезагрузить компьютер, чтобы принудительно освободить незакрытые ресурсы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню