Использование другого порта http Scheme, когда большая часть настройки выполняется статически - PullRequest
0 голосов
/ 20 июля 2010

Использование: org.apache.http

Я использую следующий код для загрузки файлов, большая часть настройки URL выполняется статически, чтобы каждый раз сохранять создание объекта.

    private static final HttpClient httpClient;

static {
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
    HttpProtocolParams.setUseExpectContinue(params, false);  
    HttpConnectionParams.setConnectionTimeout(params, 10000);
    HttpConnectionParams.setSoTimeout(params, 10000);
    ConnManagerParams.setMaxTotalConnections(params, 100);
    ConnManagerParams.setTimeout(params, 30000);

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80)); //TODO port and schema should be coming from the strings file
    ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
    httpClient = new DefaultHttpClient(manager, params);
    //httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
}

Я могу позвонить, используя

private HttpUrlRequest(String host, int port, String path, List<NameValuePair> query,  List<NameValuePair> post)

Я хочу, чтобы вызывающая сторона могла указывать номер port для URL.Но так как

registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));

задан статически, не должен ли я также изменить этот номер порта?Как я могу решить это?

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Порт, указанный Схемой, является портом по умолчанию и не обязательно является портом, используемым в фактическом соединении. Порт можно указать в каждом URL запроса. Например, если порт схемы по умолчанию - 80, а URL-адрес запроса - http://address.com:8080,, то используется 8080. Если порт не указан в URL-адресе, используется значение по умолчанию.

1 голос
/ 20 июля 2010

Я предполагаю, что реестр схем работает или работает почти как HashMap.Если я прав, вы можете изменить схему для (например) http, просто зарегистрировав новый набор аргументов.

Так что в любой момент, когда вы читаете в своем конфигурационном файле, вы можете просто повторить вызов

registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));

с другим номером порта.

Проблема: registry является локальной переменной в блоке static.Решение: сделайте

static SchemeRegistry registry; 

вне (и предпочтительно до) блока static, чтобы вы могли получить доступ к переменной, err, полю класса, позже.

Чтобы это работало, вам также нужно изменить строку

SchemeRegistry registry = new SchemeRegistry();

на

registry = new SchemeRegistry();

Если вы хотите изменить регистрацию из другого класса, вы можете сделать registry общедоступным,или дайте ему статический метод доступа или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...