Jak Mogę określić adres lokalny w java. net. URLConnection?

Moja instancja Tomcat nasłuchuje wielu adresów IP, ale chcę kontrolować, który źródłowy adres IP jest używany podczas otwierania URLConnection.

Jak mogę to określić?

Author: til, 2008-09-18

4 answers

To powinno załatwić sprawę:

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);
I jesteś skończony. Nie zapomnij ładnie radzić sobie z wyjątkami I zmienić wartości, aby pasowały do twojego scenariusza.

Ah i pominąłem instrukcje importu

 6
Author: Javaxpert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 12:34:34

Używając Apache commons HttpClient znalazłem również następujące działanie (usunięto try/catch dla jasności):

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));");

Jednak nadal zastanawiam się, co by się stało, gdyby Brama IP padła (w tym przypadku 192.168.1.11). Czy następna bramka zostanie wypróbowana, czy zawiedzie?

 3
Author: stian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:45:51

Oczywistym przenośnym sposobem byłoby ustawienie Proxy w adresie URL.openConnection. Proxy może być w lokalnym hoście, można wtedy napisać bardzo prosty proxy, który wiąże lokalny adres gniazda klienta.

Jeśli nie możesz zmodyfikować źródła, do którego adres URL jest podłączony, możesz zastąpić URLStreamHandler podczas wywoływania konstruktora URL lub globalnie przez URL.setURLStreamHandlerFactory. URLStreamHandler może następnie delegować do domyślnej obsługi http/ https, modyfikując wywołanie openConnection.

Bardziej ekstremalną metodą byłoby całkowite zastąpienie obsługi (być może rozszerzenie implementacji w JRE). Alternatywnie dostępne są alternatywne (open source) klienty http.

 1
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 12:19:35

Ręczne Ustawienie gniazda działa dobrze ...

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;
}    
 1
Author: Enzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 15:09:56