Соедините два компьютера через http без публичного IP - PullRequest
0 голосов
/ 20 ноября 2010

Я бы хотел, чтобы компьютеры / клиенты подключались напрямую друг к другу в случае, если один или оба из них не имеют публичного IP-адреса. Я думаю, что это может быть сделано с сервером в качестве посредника. Соединение, установленное в конце, должно быть прямым трафиком между клиентами. Как это возможно и как называется техника?

Мне бы очень хотелось увидеть некоторый код в Java.

Спасибо

Ответы [ 3 ]

2 голосов
/ 20 ноября 2010

Возможно, вам придется использовать дырокол ( TCP или UDP ), если обе стороны находятся за NAT. Примерно так:

socket = new DatagramSocket(port);
volatile boolean connectionEstablished = false;
volatile boolean reveivedSomething = false;

Sender-Thread:

while (!connectionEstablished) {
  byte[] buf = new byte[256];
  buf[0]=reveivedSomething?1:0;
  DatagramPacket packet = new DatagramPacket(buf, buf.length,
          otherpcpublicaddr, otherpcsport);
  socket.send(packet);
  Thread.sleep(500);
}

Приемник-Thread:

while (true) {
  byte[] buf = new byte[256];
  DatagramPacket packet = new DatagramPacket(buf, buf.length);
  socket.receive(packet);
  reveivedSomething=true;
  if (buf[0]==1) {
    connectionEstablished=true;
    break;
  }
  Thread.sleep(500);
}

(вам придется делать это на обоих ПК и обмениваться IP-адресами и портами, используя некоторый достижимый сервер, если они не статичны)

2 голосов
/ 20 ноября 2010

Если переадресация портов не является опцией, существует в основном надежный метод, который можно использовать с трафиком UDP, называемый NAT traversal .Требуется, чтобы сервер промежуточного уровня действовал как точка рандеву, но после начальной настройки весь трафик будет передаваться из конечной точки в конечную точку.

Это не будет работать во всех случаях;это зависит от того, как различные уровни NAT сопоставляют внешние конечные точки с внутренними точками.

Обход TCP NAT очень труден для реализации и имеет крайне низкий шанс даже работать.

(я успешно использовалПрохождение UDP NAT для установления соединения OpenVPN между двумя компьютерами в разных университетах, оба находятся за несколькими уровнями NAT!)

0 голосов
/ 20 ноября 2010

Я не знаю, как исправить Java, но вы могли бы использовать динамический DNS-сервис для перенаправления трафика в непубличный ip.Я думаю, что они используют клиента, который отслеживает общедоступный IP-адрес клиента, назначенный их провайдером, и сообщает об этом службе, которая затем обновляет свою таблицу хостов.Может также быть некоторая конфигурация, необходимая на маршрутизаторах каждой системы, для пересылки публичного запроса в частный ip.

Для этого потребуется несколько методов: переадресация портов, NAT, динамический DNS и т. Д.

...