代码之家  ›  专栏  ›  技术社区  ›  Stig

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

  •  0
  • Stig  · 技术社区  · 15 年前

    如果其中一个或两个都没有公共IP,我希望计算机/客户端能够直接连接到彼此。我想这可以通过中间人的服务器来实现。最终建立的连接必须是客户端之间的直接通信。这是怎么可能的?这项技术叫什么?

    我很想在Java中看到一些代码FX。

    谢谢

    3 回复  |  直到 15 年前
        1
  •  2
  •   cdhowie    15 年前

    如果端口转发不是一个选项,那么有一种最可靠的技术可以用于名为 NAT traversal . 它需要一个中间人服务器作为集合点,但是在初始设置之后,所有的流量都将是端点到端点的。

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

    TCPNAT遍历很难实现,甚至工作的机会也非常低。

    (我已经成功地使用了udp nat traversal在不同大学的两台计算机之间建立了OpenVPN连接,这两台计算机都位于几个nat层之后!)

        2
  •  2
  •   thejh    15 年前

    你应该使用 hole punching ( TCP UDP )如果双方都支持国家电视台。像这样:

    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和端口,只要它们不是静态的)

        3
  •  -2
  •   bakoyaro CoreyRDean    15 年前

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

    有几种技术可用于执行此操作,如端口转发、NAT、动态DNS等。

    推荐文章