用Java替换套接字底层URL连接

时间:2013-03-22 17:03:07

标签: java sockets url tunnel network-interface

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

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

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

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

2 个答案:

答案 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然后将其设置为默认值,但我不确定如何在客户端选择网络接口,这将是路由的功能。