发送没有端口转发的消息

时间:2013-10-23 17:54:54

标签: java networking p2p

我想在两个不同防火墙后面的java应用程序之间发送消息。有没有办法在没有端口转发的情况下执行此操作?(例如p2p,skype在做什么?)

2 个答案:

答案 0 :(得分:1)

几乎没有办法做到这一点,但经过多次搜索,我发现了一种经常运作的方式。它被称为UDP-Punching。

它也适用于TCP,但不如UDP那么好。

https://en.wikipedia.org/wiki/UDP_hole_punching (在java中,您可以使用DatagramSocket

执行此操作

答案 1 :(得分:0)

如果没有至少一个防火墙的端口转发,就无法做到这一点(假设防火墙有适当的限制规则。

使用TCP,有一个服务器和一个客户端。服务器将接受连接,并且在服务器前面的防火墙将网络流量转发给它之前,它无法接受请求。

典型的客户端防火墙允许向远程服务器发送传出请求(有时仅限于某些服务,如http和https等)。

因此,需要配置网络服务器端的防火墙,将适当的数据包转发到实际的服务器机器上。

skype之类的东西通常只有传出连接(它们不运行服务器套接字等待连接),而是连接到中央服务器,然后中央服务器为系统路由流量。 VPN通常以这种方式完成。

大多数P2P协议等其他协议要求对端运行端口,需要配置防火墙将流量转发给对等体。

在过去的几年中,已经建立了一个名为Internet Gateway Device Protocol的协议(通常标记为“UPnP”),该协议允许对等方请求防火墙根据请求转发流量。大多数bittorrent客户端允许您使用UPnP重新配置防火墙,大多数现代住宅型宽带路由器将支持这些请求。

因此,需要重新配置防火墙,但是有一些方法可以让您的服务器软件要求防火墙“自动”重新配置