我希望计算机/客户端在其中一个或两个都没有公共IP的情况下直接相互连接。我想这可以用服务器作为中间人来完成。最终建立的连接必须是客户端之间的直接流量。这怎么可能,技术叫做什么?
我真的很想在Java中看到一些代码fx。
由于
答案 0 :(得分:2)
如果无法选择端口转发,则可以使用一种主要可靠的技术来处理名为NAT traversal的UDP流量。它需要一个中间人服务器作为集合点,但在初始设置之后,所有流量都将是端点到端点。
这并不适用于所有情况;它取决于各种NAT层如何将外部端点映射到内部entpoints。
TCP NAT遍历很难实现,甚至工作的可能性极低。
(我已成功使用UDP NAT遍历在不同大学的两台计算机之间建立OpenVPN连接,这两台计算机都位于多个NAT层之后!)
答案 1 :(得分:2)
如果双方都支持NAT,您将必须使用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和端口,只要它们不是静态的)
答案 2 :(得分:-2)
我不知道Java修复,但您可以使用动态DNS服务将流量重新路由到非公共IP。我认为他们使用一个客户端来跟踪他们的ISP分配的公共客户端IP,并将其报告给服务,然后服务更新他们的主机表。每个系统的路由器上可能还需要一些配置,以便将公共请求转发到私有IP。
将会有几种技术用于执行此操作,端口转发,NAT,动态DNS等