1

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

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

谢谢

4

3 回答 3

3

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

这并非在所有情况下都有效;这取决于各种 NAT 层如何将外部端点映射到内部端点。

TCP NAT 穿越非常难以实现,甚至工作的机会极低。

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

于 2010-11-19T22:59:41.393 回答
2

如果双方都在 NAT 之后,您可能必须使用打孔TCPUDP )。像这样的东西:

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

于 2010-11-19T23:02:05.273 回答
-2

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

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

于 2010-11-19T23:00:32.877 回答