Назад | Перейти на главную страницу

HTTP-запрос с VPS на 2 IP в Java

У меня Linux VPS с двумя виртуальными сетевыми интерфейсами. У каждого свой IP:

                      vps
                    (venet0)
                  +          +
                  |          |
               venet0:0   venet0:1
          78.***.***.52   78.***.***.66

Моя цель - динамически выполнять HTTP-запросы с обоими IP-адресами. Например, я хотел бы уметь читать "http://stackoverflow.com"с IP1 и"http://serverfault.com"с IP2 в том же экземпляре программы (java).

Является ли это возможным ?

Спасибо,

Bill0ute

На самом деле это довольно просто.

Если вы знаете свои 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-адреса, просто прочтите ответ Фила. Он все об этом объясняет.

На самом деле это вопрос 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());
  }

Затем вам нужно создать свой сокет с одним из этих InetAddresses. Если у вас есть InetAddress выбранный объект называется addr тогда будет работать следующее

  Socket soc = new java.net.Socket();
  soc.bind(addr);
  soc.connect(new InetSocketAddress(address, port));

Этот метод работает для большинства языков программирования в Linux. Вы используете bind(2) с конкретным IP-адресом, чтобы сообщить системе, к какому IP-адресу и интерфейсу вы будете привязаны.