当我的客户端计算机上有多个NIC时,如何将(当然是出站)HttpUrlConnection绑定到特定的本地IP地址?

时间:2009-11-12 10:59:29

标签: java http networking

我有一种Http-Gateway应用程序,它作为本地网络外部服务器的http客户端。

将会有网络配置升级,我将遇到问题因为:
  - 客户端机器上有多个网卡   - firewall / nat规则使用硬连线IP地址

如果我可以以编程方式强制HttpUrlConnection对象使用特定的IP地址,我会没事的。但我担心无法做到。

我是对的吗?如果没有,哪个版本的JRE支持它?

其他可能的解决方案,最好是不涉及从头开始重写所有内容的解决方案? 越简单越好:我知道,有Apache HttpClient,或者我可以使用套接字......

由于

3 个答案:

答案 0 :(得分:3)

我看不出好的解决办法,但有两种不好的可能性:

  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)
    

答案 1 :(得分:2)

你做不到。 HttpURLConnection不提供任何操作套接字的接口。

你也不应该这样做。接口的选择基于路由决策。如果您必须手动选择NIC才能到达目的地,则所有互联网连接都会出现同样的问题。您应该在OS中添加静态路由,以确保将正确的接口用于目标。

答案 2 :(得分:0)

Socket类(http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html)上有一个构造函数,可以让你指定一个localAddr。这使得可能在Java中做你想做的事。

不幸的是,HttpUrlConnection及其系列类没有给你很多机会获得底层套接字。我遵循setContentHandlerFactory提供的可能性,但只允许您在套接字打开后很长时间内操作内容。

因此,我的建议是扭转管理员的手臂,更改机器的路由表,以便从该机器到目标主机的唯一可能(或最佳)路由将通过您要使用的网关。这样,当打开套接字连接时,它将默认为该网关的卡。