通过nat帮助与套接字通信

时间:2010-12-16 08:11:45

标签: java sockets network-programming

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

有人能解释我NAT是如何工作的,以及这是解决问题的方法吗?

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

我的想法是对的吗?

非常感谢!

3 个答案:

答案 0 :(得分:5)

你的NAT描述几乎正确。你所犯的唯一错误就是彼得所指出的 - 客户总是那个发起联系的人。

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

如果一方在NAT后面而另一方有公共IP,那么在NAT后面的那个发起连接就没问题。在这种情况下,NATing路由器将记住从服务器发送响应的位置。

最后,如果双方都在NAT之后,看起来似乎无法启动连接,但实际上并非总是如此。有一个被称为“hole punching”的技巧。这是一种白魔法并不总是有效,但它的工作经常足以被Skype成功使用,例如。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

  • 每个客户都应拥有公共IP,以便其他客户与他联系。每个客户端也应该充当客户端和服务器。
  • 发现客户非常困难,因为您需要知道他们的IP

您的系统可能在本地网络中运行,但它无法在互联网上运行。网络中的每台计算机都有一个本地网关为其分配的本地IP。除非有将公共IP映射到它的NAT设置,否则本地IP对外人是不可见的。还必须有外发消息的设置。