3

我有一个 Java 应用程序,用于java.net.URL打开一个位置来检索一些数据。我现在需要通过 VPN 打开连接。它运行的 Linux 机器现在可以随时打开多个隧道,我需要能够以编程方式告诉应用程序使用哪个隧道。

我相信使用java.net.Socket它可以选择虚拟设备来打开连接,但我找不到任何方法来覆盖 URL 对象以处理所有 HTTP 流量 - 或者在实际打开连接之前替换底层套接字。

那么,如何将我的应用程序连接到特定的网络接口并保持使用高级对象的优势java.net.URL

现在,我不确定这是否可能,但我想我会问明智的 stackoverflow 社区......

4

2 回答 2

3

我相信您可以URLStreamHandlerFactory使用java.net.URL. 每当openConnection()在 URL 上调用它时,它都会由这个注册的自定义工厂处理,让您可以控制套接字连接的详细信息。

一旦您有能力操作套接字创建,指定您使用的网络接口就相当简单了:

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

于 2013-03-22T17:22:30.573 回答
0

您可以实现自定义 SocketImplFactory,然后使用 Socket.setSocketImplFactory 将其设置为默认值,但我不确定如何在客户端选择网络接口,这将是路由的功能。

于 2013-03-22T17:26:50.697 回答