Чтение данных из Http-ответа редко вызывает BindException: адрес уже используется - PullRequest
1 голос
/ 17 ноября 2010

Я использую следующий код для чтения данных 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. Спасибовы

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

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

1 голос
/ 17 ноября 2010

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

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

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

См. Также:

...