Как я могу связать (конечно, исходящий) HttpUrlConnection с конкретным локальным IP-адресом, когда у меня есть несколько сетевых карт на моем клиентском компьютере? - PullRequest
2 голосов
/ 12 ноября 2009

У меня есть своего рода приложение Http-Gateway, которое действует как http-клиент для серверов вне нашей локальной сети.

Будет обновление конфигурации сети, и у меня будут проблемы, потому что:
- на клиентском компьютере есть несколько сетевых карт
- правила брандмауэра / nat используют IP-адреса с жесткой проводкой

Если бы я мог программно заставить объект HttpUrlConnection использовать определенный IP-адрес, я был бы в порядке. Но я боюсь, что это не может быть сделано.

Я прав? Если нет, то какая версия JRE его поддерживает?

Другие возможные решения, предпочтительно те, которые не требуют переписывания всего с нуля?
Чем проще, тем лучше: я знаю, есть Apache HttpClient, или я мог бы использовать Sockets ...

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 ноября 2009

Я не вижу хорошего решения, но есть две плохие возможности:

  1. Прокси-соединения локально:

    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
            "proxy", 5555));
    URLConnection urlConnection = url.openConnection(proxy);
    
  2. Зарегистрировать пользовательский URLStreamHandlerFactory с помощью java.net.URL. Всякий раз, когда openConnection() вызывается на URL, он будет обрабатываться этой зарегистрированной фабрикой, предоставляя вам контроль над деталями соединения сокета. Или использовать реализацию Apache или накатить свою собственную?

    Url.setURLStreamHandlerFactory(URLStreamHandlerFactory fac)
    
2 голосов
/ 12 ноября 2009

Вы не можете. HttpURLConnection не предоставляет никакого интерфейса для управления сокетом.

Ты тоже не должен этого делать. Выбор интерфейса основан на решении о маршрутизации. Если вам нужно вручную выбрать сетевой адаптер, чтобы добраться до места назначения, все ваше интернет-соединение будет иметь ту же проблему. Вы должны добавить статический маршрут в ОС, чтобы убедиться, что для пункта назначения используется правильный интерфейс.

0 голосов
/ 12 ноября 2009

В классе Socket есть конструктор (http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html), который позволит вам указать localAddr. Это делает возможным делать то, что вы хотите в Java.

К сожалению, HttpUrlConnection и его семейство классов не дают вам большой возможности добраться до базового сокета. Я воспользовался возможностью, предложенной setContentHandlerFactory, но это позволяет вам манипулировать контентом еще долго после открытия сокета.

Таким образом, я бы посоветовал вашему администратору изменить таблицу маршрутизации вашей машины так, чтобы единственный возможный (или оптимальный) маршрут от этой машины к вашим целевым хостам проходил через шлюз, который вы хотите использовать , Таким образом, при открытии сокетного соединения по умолчанию используется карта для этого шлюза.

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