我想在两个不同防火墙后面的java应用程序之间发送消息。有没有办法在没有端口转发的情况下执行此操作?(例如p2p,skype在做什么?)
答案 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重新配置防火墙,大多数现代住宅型宽带路由器将支持这些请求。
因此,需要重新配置防火墙,但是有一些方法可以让您的服务器软件要求防火墙“自动”重新配置