![](/img/trans.png)
[英]Apache SocketFactory compatible with java.net SocketFactory?
[英]How to use a custom socketfactory in Apache HttpComponents
我一直在嘗試在Apache HTTPComponents項目的httpclient庫中使用自定義SocketFactory。 到目前為止沒有運氣。 我原以為我可以為HttpClient實例設置套接字工廠,但顯然不是那么容易。
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html上的HttpComponents文檔確實提到了套接字工廠,但沒有說明如何使用它們。
有誰知道這是怎么做的?
我們使用自定義套接字工廠允許HttpClient連接使用不受信任的證書連接到HTTPS URL。
我們是這樣做的:
我們從Oleg引用的示例源目錄中調整了'EasySSLProtocolSocketFactory'和'EasyX509TrustManager'類的實現。
在我們的HttpClient啟動代碼中,我們執行以下操作以啟用新的套接字工廠:
HttpClient httpClient = new HttpClient(); Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443); Protocol.registerProtocol("https", easyhttps);
因此,只要我們請求https:// URL,就會使用此套接字工廠。
oleg的答案當然是正確的,我只是想直接把信息放在這里,以防鏈接變壞。 在創建HttpClient的代碼中,我使用此代碼讓它使用我的套接字工廠:
CustomSocketFactory socketFactory = new CustomSocketFactory();
Scheme scheme = new Scheme("http", 80, socketFactory);
httpclient.getConnectionManager().getSchemeRegistry().register(scheme);
CustomSocketFactory
是我自己的套接字工廠,我想將它用於普通的HTTP流量,這就是我使用"http"
和80
作為參數的原因。
我的CustomSchemeSocketFactory看起來類似於:
public class CustomSchemeSocketFactory implements SchemeSocketFactory {
@Override
public Socket connectSocket( Socket socket, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpParams params ) throws IOException, UnknownHostException, ConnectTimeoutException {
if (localAddress != null) {
socket.setReuseAddress(HttpConnectionParams.getSoReuseaddr(params));
socket.bind(localAddress);
}
int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
int soTimeout = HttpConnectionParams.getSoTimeout(params);
try {
socket.setSoTimeout(soTimeout);
socket.connect(remoteAddress, connTimeout );
} catch (SocketTimeoutException ex) {
throw new ConnectTimeoutException("Connect to " + remoteAddress + " timed out");
}
return socket;
}
@Override
public Socket createSocket( HttpParams params ) throws IOException {
// create my own socket and return it
}
@Override
public boolean isSecure( Socket socket ) throws IllegalArgumentException {
return false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.