关于心跳信号

普通用户可以忽略本节内容。

我们前面已经看到,在启动QQServer时,需要设置心跳间隔和心跳超时。
当QQClient连接到QQServer时,会根据QQServer的设置,定期向QQServer和好友发送心跳信号。

心跳信号的作用有两方面:

维持通道

多数时候,客户端是通过路由器连接外网的,这样局域网中的多个计算机,可以共享一个外网IP和外网进行通讯。

外网是不能直接访问内网计算机的,只能由内网计算机发起访问。

当我们在内网计算机使用某一端口经过路由器连接外网时,会将内网地址(包括IP和端口)转换为相应的外网地址。
例如局域网中计算机A在内网的IP地址是:192.168.100.8,路由器的外网IP是87.68.151.180,计算机A使用端口8088通过路由器连接外网时,会进行如下的转换:

192.168.100.8088(计算机A) → 87.68.151.180:62148(路由器) → 外网

也就是说,外网的计算机收到来自计算机A的信息时,会认为这个信息的来源地址是87.68.151.180:62148。

提醒:62148是随机的,可能是路由器任何一个未被占用的端口

当外网计算机向计算机A发送信息时,会将信息发送发送到87.68.151.180:62148,局域网的路由器收到此信息后,将此消息转发到内网地址192.168.100.8088,所以计算机A也就收到了外网发来的信息:

外网 → 87.68.151.180:62148(路由器) → 192.168.100.8088(计算机A)

这等于在计算机A和外网之间开辟了一条双向通道,路由器会维持很多这样的通道,每个通道对应一个端口,路由器会记忆每个端口(通道)对应的是局域网中的那台计算机。

由于端口是有限的,如果某一个通道长期没有使用,此通道就会被关闭,从而腾出对应的端口给其他计算机或程序使用。

所以局域网中的QQClient连接外网的QQserver,需要定期发送信号,以便持续占用所分配的外网端口,这就是心跳信号。

实际上在启动QQClient的时候,并不需要指定端口,Foxtable会自动给QQClient分配一个端口的。
但是QQServer是需要明确指定端口的,这是为什么呢?
这是因为QQClient是主动连接QQServer的,当然需要事先知道QQServer的IP地址和端口,这就像打电话,拨号的一方需要先知道对方的号码。

检测意外断线

如果我们正常退出某个QQClient,QQClient会在退出之前,向QQserver和好友发送“我下线了”的通知信号。

如果某个QQClient的网络意外中断,那么服务器和其它客户端是不会收到该QQClient已经下线的通知的,以至于始终认为该QQClient在线。

如何解决这个问题呢? 只能通过心跳信号了。

当服务器超过一定时间(心跳超时)没有收到某个QQClient的心跳信号时,就会认为这个QQClient已经意外断线,就会给该QQClient的好友发送其“超时断线”的通知。

显然QQServer的心跳间隔和心跳超时设置得越小,就越能快速检查出这种意外断线,但是如果在线用户量大,那么间隔太小的话, 就会加重服务器的负担。

默认的心跳间隔是30秒,心跳超时是100秒,具体时间大家可以自己调整 ,心跳超时一般设置为心跳间隔的3倍左右,也就是连续3次没有收到心跳信号,即认为客户端已经离线。

需要注意的是,必须重启QQServer,心跳间隔和心跳超时才能生效。


本页地址:http://www.foxtable.com/webhelp/topics/2973.htm