如何在 java.net.URLConnection 上指定本地地址?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/91678/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I specify the local address on a java.net.URLConnection?
提问by stian
My Tomcat instance is listening to multiple IP addresses, but I want to control which source IP address is used when opening a URLConnection.
我的 Tomcat 实例正在侦听多个 IP 地址,但我想在打开URLConnection.
How can I specify this?
我该如何指定?
采纳答案by Javaxpert
This should do the trick:
这应该可以解决问题:
URL url = new URL(yourUrlHere);
Proxy proxy = new Proxy(Proxy.Type.DIRECT,
new InetSocketAddress(
InetAddress.getByAddress(
new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);
And you are done. Dont forget to handle exceptions nicely and off course change the values to suit your scenario.
你已经完成了。不要忘记很好地处理异常,当然也不要忘记更改值以适合您的场景。
Ah and I omitted the import statements
啊,我省略了导入语句
回答by stian
Using the Apache commons HttpClient I have also found the following to work (removed try/catch for clarity):
使用 Apache commons HttpClient 我还发现以下内容可以工作(为了清楚起见,删除了 try/catch):
HostConfiguration hostConfiguration = new HostConfiguration();
byte b[] = new byte[4];
b[0] = new Integer(192).byteValue();
b[1] = new Integer(168).byteValue();
b[2] = new Integer(1).byteValue();
b[3] = new Integer(11).byteValue();
hostConfiguration.setLocalAddress(InetAddress.getByAddress(b));
HttpClient client = new HttpClient();
client.setHostConfiguration(hostConfiguration);
GetMethod method = new GetMethod("http://remoteserver/");
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false));
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + method.getStatusLine());
}
byte[] responseBody = method.getResponseBody();
System.out.println(new String(responseBody));");
However, I still wonder what would happen if the gateway of the IP is down (192.168.1.11 in this case). Will the next gateway be tried or will it fail?
但是,我仍然想知道如果 IP 的网关关闭会发生什么(在这种情况下为 192.168.1.11)。下一个网关会被尝试还是会失败?
回答by Enzo
Setting manually socket work fine ...
手动设置套接字工作正常......
private HttpsURLConnection openConnection(URL src, URL dest, SSLContext sslContext)
throws IOException, ProtocolException {
HttpsURLConnection connection = (HttpsURLConnection) dest.openConnection();
HttpsHostNameVerifier httpsHostNameVerifier = new HttpsHostNameVerifier();
connection.setHostnameVerifier(httpsHostNameVerifier);
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setRequestMethod(POST_METHOD);
connection.setRequestProperty(CONTENT_TYPE, SoapConstants.CONTENT_TYPE_HEADER);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setSSLSocketFactory(sslContext.getSocketFactory());
if ( src!=null ) {
InetAddress inetAddress = InetAddress.getByName(src.getHost());
int destPort = dest.getPort();
if ( destPort <=0 )
destPort=SERVER_HTTPS_PORT;
int srcPort = src.getPort();
if ( srcPort <=0 )
srcPort=CLIENT_HTTPS_PORT;
connectionSocket = connection.getSSLSocketFactory().createSocket(dest.getHost(), destPort, inetAddress, srcPort);
}
connection.connect();
return connection;
}
回答by Tom Hawtin - tackline
The obvious portable way would be to set a Proxy in URL.openConnection. The proxy can be in local host, you can then write a very simple proxy that binds the local address of the client socket.
显而易见的可移植方式是在 URL.openConnection 中设置代理。代理可以在本地主机中,然后您可以编写一个非常简单的代理来绑定客户端套接字的本地地址。
If you can't modify the source where the URL is connected, you can replace the URLStreamHandler either when calling the URL constructor or globally through URL.setURLStreamHandlerFactory. The URLStreamHandler can then delegate to the default http/https handler, modifying the openConnection call.
如果无法修改URL连接的源,可以在调用URL构造函数时或者通过URL.setURLStreamHandlerFactory全局替换URLStreamHandler。URLStreamHandler 然后可以委托给默认的 http/https 处理程序,修改 openConnection 调用。
A more extreme method would be to completely replace the handler (perhaps extending the implementation in your JRE). Alternatively, alternative (open source) http clients are available.
更极端的方法是完全替换处理程序(可能扩展 JRE 中的实现)。或者,可以使用替代(开源)http 客户端。

