У меня 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-адресу и интерфейсу вы будете привязаны.