我有一个带有 2 个虚拟网络接口的 Linux VPS。每个接口都有自己的 IP:
vps
(venet0)
+ +
| |
venet0:0 venet0:1
78.***.***.52 78.***.***.66
我的目标是动态地使用两个 IP 发出 HTTP 请求。例如,我希望能够读取“http://stackoverflow.com“ 与 IP1 和 “http://serverfault.com“与IP2在同一个程序实例(java)中。
是否可以 ?
谢谢,
Bill0ute
答案1
这实际上是一个 Java 问题,更适合 stackoverflow.com。
但是,值得注意的是,一般来说,这种技术在所有不会过多地抽象套接字接口的编程语言中都很常见。
执行此操作的默认方法是通过指定套接字内的接口或 IP。
您需要将一个传递InetAddress
给 Socket.bind()。您可以使用Eumeration
以下代码从特定接口获取一个 IP 地址:
String iface = "venet0:0";
NetworkInterface nif = NetworkInterface.getByName(iface);
Enumeration nifAddresses = nif.getInetAddresses();
while (nifAddresses.hasMoreElements()) {
InetAddress addr = (InetAddress) nifAddresses.nextElement();
System.out.println(addr.getHostAddress());
}
然后,您需要使用其中一个 InetAddress 创建套接字。如果您InetAddress
选择了一个名为的对象addr
,则以下内容将起作用
Socket soc = new java.net.Socket();
soc.bind(addr);
soc.connect(new InetSocketAddress(address, port));
此技术适用于 Linux 上的大多数编程语言。您使用bind(2)
特定 IP 来告诉系统您将绑定到哪个 IP 地址和接口。
答案2
事实上,这很简单。
如果您知道您的 IP 地址,例如 IP1 和 IP2,则只需创建一个套接字并将其绑定到您要使用的 IP。例如,如果 IP1 = 56.89.122.5:
Socket s = new Socket ();
s.bind (new InetSocketAddress ("56.89.122.5", 0)); // The second attribut is the Port. If it's value is 0, Java will automatically choose a free port.
s.connect (new InetSocketAddress ("myServerIp", 80));
然后,发送 HTTP 请求。我这样做:
PrintWriter writer = new PrintWriter (s.getOutputStream ());
BufferedReader reader = new BufferedReader (new InputStreamReader (s.getInputStream ()));
// Its an exemple of a GET request
writer.print ("GET http://myUrl.com HTTP/1.0\r\n\r\n");
writer.flush ();
StringBuffer sbResp = new StringBuffer ();
String szLine = new String ();
// I get the response here
while ((szLine = reader.readLine ()) != null)
sb.append (szLine);
s .close ();
reader.close ();
writer.close ();
如果您不知道您的 IP 地址,请阅读 Phil 的回答。他对此进行了全面解释。