我有一个 Java 应用程序,它使用 java.net.URL
打开一个位置来检索一些数据。我现在需要通过 VPN 打开连接。它运行的 Linux 机器现在可以随时打开多个隧道,我需要能够以编程方式告诉应用程序使用哪个隧道。
我相信使用 java.net.Socket
可以选择虚拟设备打开连接,但我找不到任何方法来覆盖 URL 对象来处理所有 HTTP 流量- 或者在实际打开连接之前替换底层套接字。
那么,如何将我的应用程序连接到特定的网络接口(interface)并保持使用像 java.net.URL
这样的高级对象的优势?
现在,我不确定这是否可能,但我想我会问问聪明的 stackoverflow 社区......
最佳答案
我相信您可以使用 java.net.URL
注册自定义 URLStreamHandlerFactory
。每当在 URL 上调用 openConnection()
时,它都会由这个已注册的自定义工厂处理,让您可以控制套接字连接的细节。
一旦您能够操作套接字创建,指定您使用的网络接口(interface)就相当简单了:
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
关于java - 替换 Java 中的套接字底层 URL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576029/