做聊天软件,如何穿透内网通信?
我在练习写个聊天的软件,就像QQ那样点对点聊天,要能在公网上使用。我想出的方案是这样:
有个收集用户IP地址的服务器,放在公网上。然后客户端要登陆,登陆的主要目的就是想这个服务器“报到”,服务器接收到登陆消息后,记录这个用户的在线状态和IP地址。然后另一个用户(例如是刚才那个用户的好友)也来登陆的时候,服务器检查这个新登陆用户的好友,一个个查看他的好友的登陆状态和IP,然后反馈给这个新登陆用户。同时把新登陆用户的ip也告知刚才的用户。这样两人的客户端都有了对方的ip,他们之间就可以点对点直接通信,不需再通过服务器了。
但有个关键的问题:如果用户是在某个内网里(例如公司的局域网里,像192.168.*.*和10.0.*.*这样的地址的),内网与外网如何通信?要知道,一个外网IP要通过TCP或者UDP发个消息给内网ip,是不行的。就是说,一个外网用户,另一个是内网用户,他们如何实现通信?QQ是做到了这点的,它是怎么做到的?