2010-12-16 67 views
3

我想在java中创建一个简单的p2p信使,我设法与同一网络中的两台计算机进行通信,但是当我尝试从网络外部向另一台计算机发送消息时,正在消失......我知道我可以在路由器中前进,但我不想那样做,我想让它像雅虎,gtalk或其他im服务器那样做。 我认为他们使用NAT系统来做到这一点,但我不知道如何:D。帮助通过NAT与套接字进行通信

有人能解释我NAT如何工作,如果这是解决我的问题的方式?

我读到我需要服务器的静态和公共IP,当客户端(使用私有IP)向服务器发送请求时,他的NAT将知道如何处理来自服务器的消息下一次...但是如果客户端不向服务器发送请求,并且服务器向客户端发送数据包,则NAT不知道将数据包发送到网络内部(到客户端)的位置。

我想是不是正确?

非常感谢!

回答

5

你几乎在你的NAT描述中是正确的。你所犯的唯一错误就是彼得指出的 - 客户始终是启动连接的人。

现在,如果双方都有公有IP,一切都很好,任何一方都可以成为服务器。

如果一方位于NAT后方,另一方位于公共IP地址,那么NAT后面的位置启动连接即可​​。在这种情况下,NATing路由器会记住从服务器发送响应的位置。

最后,如果双方都支持NAT,看起来不可能启动连接,但实际上并非总是如此。有一个技巧叫做“hole punching”。这是一种白色魔法,它并不总是有效,但它通常足以被Skype成功使用。

+0

此外,某些路由器允许通过UPNP定义动态端口转发,但必须启用它。如果双方都支持NAT,那将是我推荐的方式。 – ZeissS 2010-12-16 09:23:58

+0

谢谢你的回答,现在我明白了这个过程! – Cata 2010-12-16 09:41:10

+0

也就是说,如果您有权访问这些路由器。如果一台路由器属于你的ISP,那会​​起作用吗? – 2010-12-16 09:43:04

0

客户机按定义发起请求,服务器请求并发送回应的响应。假设客户端可以被信任进行网络连接,服务器则不能。顺便说一句:在某些网络上,客户甚至不信任这样做,并且必须使用代理。

我重复一遍;客户端是创建连接的客户端,无论是在您的网络上还是在互联网上。

0

您提到的所有其他系统都使用具有众所周知的公共IP的服务器来帮助客户相互通信。每个客户端与服务器进行通信,服务器将每条消息发送给相应的客户端。这也许是唯一的方法,否则:

  • 每个客户都应该有一个公共IP,以便其他客户能够联系到他。每个客户端也应该作为客户端和服务器。
  • 这将是非常难以发现的客户,你需要知道他们的IPS

您的系统可能局域网内工作,但它不会在互联网上工作。网络中的每台计算机都有本地网关分配的本地IP。这个本地IP对外人来说是不可见的,除非有NAT设置将公共IP映射到它。此外,还必须有传出消息的设置。

+0

并非每个ISP都提供本地IP地址。我有两个互联网连接,其中一个通过PPP为我提供公共IP,并且几乎总是一样的。即使有时会改变,我也会建立DynDNS。另一个连接使用了固定的私有IP,但后来我要求他们将IP切换为公共。现在我有一个固定的公共IP,但我必须付钱(尽管很少)。 – 2010-12-16 08:54:23

+0

当然,但如果您创建家庭网络,第二台计算机将获得本地IP。事实上,如果您使用的是路由器,那么甚至您的第一台计算机也可能拥有本地IP,并且对您的公共IP无所知晓。 – kgiannakakis 2010-12-16 09:12:19