通过http连接两台计算机,无需公共IP

时间:2010-11-19 22:52:31

标签: java connection hole-punching

我希望计算机/客户端在其中一个或两个都没有公共IP的情况下直接相互连接。我想这可以用服务器作为中间人来完成。最终建立的连接必须是客户端之间的直接流量。这怎么可能,技术叫做什么?

我真的很想在Java中看到一些代码fx。

由于

3 个答案:

答案 0 :(得分:2)

如果无法选择端口转发,则可以使用一种主要可靠的技术来处理名为NAT traversal的UDP流量。它需要一个中间人服务器作为集合点,但在初始设置之后,所有流量都将是端点到端点。

这并不适用于所有情况;它取决于各种NAT层如何将外部端点映射到内部entpoints。

TCP NAT遍历很难实现,甚至工作的可能性极低。

(我已成功使用UDP NAT遍历在不同大学的两台计算机之间建立OpenVPN连接,这两台计算机都位于多个NAT层之后!)

答案 1 :(得分:2)

如果双方都支持NAT,您将必须使用hole punchingTCPUDP)。像这样:

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

发件人螺纹:

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);
}

接收机线程:

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);
}

(您必须在两台PC上执行此操作,并使用一些可访问的服务器交换IP和端口,只要它们不是静态的)

答案 2 :(得分:-2)

我不知道Java修复,但您可以使用动态DNS服务将流量重新路由到非公共IP。我认为他们使用一个客户端来跟踪他们的ISP分配的公共客户端IP,并将其报告给服务,然后服务更新他们的主机表。每个系统的路由器上可能还需要一些配置,以便将公共请求转发到私有IP。

将会有几种技术用于执行此操作,端口转发,NAT,动态DNS等