我有一个Java应用程序,它使用java.net.URL
打开一个位置来检索一些数据。我现在需要通过VPN打开连接。它运行的Linux机器现在可以在任何时候打开多个隧道,我需要能够以编程方式告诉应用程序使用哪个隧道。
我相信使用java.net.Socket
可以选择虚拟设备来打开连接,但我找不到任何方法来覆盖URL对象来处理所有HTTP流量 - 或者更换底层套接字之前实际打开连接。
那么,如何将我的应用程序连接到特定的网络接口并保留使用java.net.URL
等高级对象的优势?
现在,我不确定这是否可行,但我想我会问明智的stackoverflow社区...
答案 0 :(得分:3)
我相信您可以使用URLStreamHandlerFactory
注册自定义java.net.URL
。每当在URL上调用openConnection()
时,它将由此注册的自定义工厂处理,使您可以控制套接字连接的详细信息。
一旦你能够操作套接字创建,指定你使用的网络接口是相当简单的:
NetworkInterface ni = NetworkInterface.getByName("eth0");
Socket socket = new Socket();
socket.bind(ni.getInetAddresses().nextElement());
看起来有一些库可以提供简单的访问来设置HTTP连接使用的socketFactory。请参阅示例http://faban.org/1.1/docs/api/index.html?com/sun/faban/driver/transport/sunhttp/HttpURLConnection.html
答案 1 :(得分:0)
您可以使用Socket.setSocketImplFactory实现自定义SocketImplFactory然后将其设置为默认值,但我不确定如何在客户端选择网络接口,这将是路由的功能。