首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过http连接两台没有公网IP的计算机

通过http连接两台没有公网IP的计算机
EN

Stack Overflow用户
提问于 2010-11-20 06:52:31
回答 3查看 4.5K关注 0票数 1

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

我真的很想看看用Java编写的fx代码。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-20 06:59:41

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2010-11-20 07:02:05

如果双方都支持NAT,则可能必须使用hole punching (TCPUDP)。如下所示:

代码语言:javascript
复制
socket = new DatagramSocket(port);
volatile boolean connectionEstablished = false;
volatile boolean reveivedSomething = false;

发件人-线程:

代码语言:javascript
复制
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);
}

接收器-线程:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-11-20 07:00:33

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

可以使用几种技术来执行此操作,如端口转发、NAT、动态DNS等

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4230107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档