使用 Java 在 2 个 IP 上使用 VPS 进行 HTTP 请求

使用 Java 在 2 个 IP 上使用 VPS 进行 HTTP 请求

我有一个带有 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 的回答。他对此进行了全面解释。

相关内容