我正在开发一个程序,该程序需要能够雄辩地处理防火墙,同时允许2个客户端之间的直接通信。
我在考虑类似于Skype的东西,其中第三方用于建立两个用户之间的连接,但是一旦建立连接,没有任何实际数据被发送到第三方。
据我所知,几乎所有防火墙都会阻止所有未经请求的传入流量,但只要内部程序是第一个进行通信的话,就可以很容易地让程序建立连接。我不明白的是如何直接在两个客户端之间建立连接。
我该如何实现这样的东西?对于这种技术的称呼,有没有合适的术语?一个客户端必须用Java编写,但服务器和其他客户端可以使用我想要的任何语言。
如果已经提出这个问题,我提前道歉,我试着环顾四周,但我觉得我可能没有使用正确的关键字来找到它。
答案 0 :(得分:2)
我认为您正在寻找的术语是“NAT traversal”。它不是关于防火墙,而是更多关于克服到达NAT设备的另一(私有)端的特定节点的困难(例如,有线调制解调器,其中LAN侧通常被分配一些不可路由的地址范围,如{ {1}})
一种可能适合您的技术是UDP hole punching。每个端点都可以建立到第三方服务器的传出连接,每个端点的NAT设备将打开端口以允许通过防火墙的返回流量并将其路由到每侧的相应LAN节点。端点通过第三方服务器交换端口信息,然后重新使用它们刚刚通过NAT设备“打孔”的“漏洞”,从那一点开始直接相互通信。
答案 1 :(得分:1)
正如Jim所说的那样是Traversal NAT,或STUN。有一个Java实现,项目不再维护,但你可以用它来学习。
答案 2 :(得分:0)
这取决于你想要的东西!!
如果您希望仅在大约85%的时间内使用STUN服务器! 这是一些免费的列表:
https://gist.github.com/zziuni/3741933
但是对于100%你还需要实现TURN服务器(中继服务器),这真的很贵!因为您的所有流量都会通过您的服务器并转发给客户,您可以看到https://www.twilio.com/stun-turn看看它有多贵,您也可以为我自己部署最好的流量https://code.google.com/p/rfc5766-turn-server/
但这只是冰山一角!!!!!!!!!
现在你知道如何在客户端之间发送交换数据了! 但您使用信号服务器创建通信会话,因为当我想给您打电话时,您必须收到一条通知,说我正试图给您打电话。
然后,如果我们接受电话,我们仍然需要交换我们将如何谈话!为什么因为也许我可以p2p但你不能这样我们必须使用中继服务器。下一步是说我们将要发送的内容,在我们开始正常通信之后......
阅读 webrtc 以更好地了解这一点
我希望它有所帮助