当大多数设置静态完成时,使用不同的http Scheme端口

时间:2010-07-20 11:27:32

标签: java httpclient

使用:org.apache.http

我使用以下代码下载文件,大部分网址设置都是静态完成的,以便每次都保存创建对象。

    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)

我希望调用者能够为URL指定端口编号。但是因为

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

是静态指定的,我不也要更改该端口号吗?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

Scheme指定的端口是默认端口,不一定是实际连接中使用的端口。可以在每个请求URL中指定端口。例如,如果Scheme默认端口为80但请求URL为http://address.com:8080,则使用8080。如果未在URL中指定端口,则使用默认值。

答案 1 :(得分:1)

我猜测方案注册表是或者像HashMap一样工作。如果我是对的,你可以通过注册一组新的参数来改变(例如)http的方案。

因此,无论您在配置文件中读到什么内容,都可以重复调用

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

使用不同的端口号。

问题:registrystatic块中的局部变量。解决方案:做

static SchemeRegistry registry; 

在你的static块之外(最好是之前),这样你以后就可以访问变量err,class字段了。

要使这项工作,您还需要更改行

SchemeRegistry registry = new SchemeRegistry();

registry = new SchemeRegistry();

如果您想从其他课程进行注册更改,可以将registry公开,或者为其提供静态访问者或其他内容。