我有一种Http-Gateway应用程序,它作为本地网络外部服务器的http客户端。
将会有网络配置升级,我将遇到问题因为:
- 客户端机器上有多个网卡
- firewall / nat规则使用硬连线IP地址
如果我可以以编程方式强制HttpUrlConnection对象使用特定的IP地址,我会没事的。但我担心无法做到。
我是对的吗?如果没有,哪个版本的JRE支持它?
其他可能的解决方案,最好是不涉及从头开始重写所有内容的解决方案? 越简单越好:我知道,有Apache HttpClient,或者我可以使用套接字......
由于
答案 0 :(得分:3)
我看不出好的解决办法,但有两种不好的可能性:
在本地代理连接:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
"proxy", 5555));
URLConnection urlConnection = url.openConnection(proxy);
使用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
提供的可能性,但只允许您在套接字打开后很长时间内操作内容。
因此,我的建议是扭转管理员的手臂,更改机器的路由表,以便从该机器到目标主机的唯一可能(或最佳)路由将通过您要使用的网关。这样,当打开套接字连接时,它将默认为该网关的卡。