相关IM的消息传递
有关IM的消息传递?看书学习发现进步很慢,最近想一步一步做个简单的IM(即时通讯)软件。大家别笑话,我觉得有
有关IM的消息传递?
看书学习发现进步很慢,最近想一步一步做个简单的IM(即时通讯)软件。
大家别笑话,我觉得有了目标,一步一步做,即时最后东西做死了,也肯定是有进步的。
看到大家都说,做项目之前,要先进行设计。
需求设计就不做了,类似于QQ那样,有服务器端和客户端,最后可以实现 客户端 和 客户端 聊天。
只是先实现最简单的功能而已,至于什么大量客户造成的高负荷,什么同时几万个tcp连接,这些问题我肯定都不懂。
界面就用MFC来做,通信用socket(Windows socket API或者MFC里面的CSyncSocket类),数据库用SQLite。
首先先来做 服务器端 的概要设计。现在想问大家一个问题:
比如2个QQ客户端聊天,A发给B的信息,是先到服务器,再由服务器发给B吗?
还是A到服务器获取B的ip,建立AB之间的tcp连接,然后将消息发给B,如果发现连接不上B,再发给我服务器,服务器在B登录的时候再发给B。
这是第一个问题,最多就能发20分的帖子。
[解决办法]
IM很少有服务器转发的,因为效率。
为穿透NAT,一般不用TCP,而用UDP。
在登录时获得好友的在线状态(以及IP/PORT)。服务器通知好友的上下线事件。
[解决办法]
[解决办法]因为UDP不是面向连接的,甚至可以广播,组播。所以你发个包出去,网关要允许不同源地址的IP包回到你的UDP端口。因此你在登录过程中向公网的服务器发一个包,网关就映射好了一个外网IP/PORT,并修改你的IP包;服务器看到的源地址就是这个NAT后的IP/PORT。此后所有目的地址是此地址的报文到达网关时,网关会修改目的地址为NAT之前(你本机看到自己的地址、端口),就会发送到你的机器上。
所以服务器把它看到的地址告诉别的客户端,别的客户端也可以把报文发送到你的机器上,无论别的客户端是否在网关后面。
[解决办法]TCP面向连接,第一个Syn包发给公网上的服务器,服务器看到NAT后的IP/port。但其他客户端不能使用此IP/PORT。因为TCB在等待特定sequence number的Syn/ack报文。如果别的客户端发送个syn到此端口,会导致RST,TCP连接不能建立。
[解决办法]ndy_w大神讲的让我貌似懂了点什么,能不能给个例子或者是文档关于nat穿透的,让我来学习学习!多谢了!