通过nat帮助与套接字通信

Cat*_*ata 3 java sockets network-programming

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

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

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

我认为是对的吗?

非常感谢你!

Ser*_*nov 6

你的NAT描述几乎是正确的.您所犯的唯一错误是Peter所指出的 - 客户端始终是启动连接的错误.

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

如果一方在NAT后面而另一方有公共IP,那么如果NAT后面的那个启动连接就可以了.在这种情况下,NATing路由器将记住从服务器发送响应的位置.

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