常见问题
答:

可以的。我们常见的即时聊天工具从技术实现上有2种,一种是建立在TCP长连接上的, 另一种是建立在轮询机制上的。早期的很多聊天室就是建立在轮询基础上的,客户端不断的发送http请求,询问服务器有没有聊天信息。很显然,这种方式对服务器的压力很大,现在已经不再使用了。

那现在网页端的聊天工具怎么实现的,如果您使用openfire,那么可以使用strophe这个库,地址http://strophe.im/。这个库使用http的长连接来模拟tcp的长连接,做到服务器有新消息,可以第一时间发送到客户端。更多的知识,你可以参考本网站,或者自己学习。

答:

首先把 Packet 、IQ 、Message 、Presence并列起来是不对的,xmpp协议中只有IQ 、Message 、Presence。由于这三种消息有共同点,所以定义了一个Packet作为IQ 、Message 、Presence的基类,例如每种消息都有一个Id,就定义在基类Packet中。

那么Presence、Message 、IQ 到底是什么?

Presence表示某个人是在线还是离线状态。A可以发送Presence消息给B,表示自己在线还是离线。

Message表示从一个人到另一个人发送消息,我们的聊天信息就放在message的body中,message有两种类型:组消息和单点消息。

IQ :是控制消息,除了presence和message完成的功能,其他功能都由IQ来做,例如加人到组,从组中踢人等。

答:

openfire使用的是xmpp协议,xmpp协议本身是提供注册功能的。这里http://xmpp.org/protocols/jabber_iq_register/定义了XMPP的注册协议,如果您觉得比较难,那么没关系,我们的视频中对注册协议有所讲到。

不过要提醒大家,在实际的项目中基本不用xmpp的注册机制,而是使用的一般网站的注册方法,使用网站来注册用户,然后再在openfire中登录,这样有很多优点,例如比较方便管理用户,可以监控注册,可以减少openfire服务器的负担,甚至针对注册接口的攻击等。

我们的课程对这两种注册方式都会讲到,欢迎大家观看。

答: 有的同学反映openfire消息乱码,我和我的同事装过上百篇openfire,都没有遇到过。那么我们分析一下这个问题吧。首先确定您的在线消息是不是乱码,一般情况下,不会是乱码,如果是,那么很可能是客户端传过来的就是乱码。如果离线是乱码,那么最有可能是数据库不是utf-8,那乱码非常有可能,当然最好是utf8mb4_general_ci,这样mb4支持表情,否者离线表情容易丢失,当然mb4需要5.5以上的mysql。那么最后的解决办法,就是,重装数据库,换一台机器试一下,升级数据库,重新建表等。哈哈,快点赞吧。
答:

客户端与openfire断开有很多可能,我们这里只分析其中一个。简单来说,我们目前的网络是很不稳定的,特别是移动互联网,上个厕所(在一个狭窄的空间中),有可能我们的网络就断线了。由于在网络断线前,客户端根本没有机会告诉服务器,客户端已经断线了,所以服务器端对于这个用户的状态依然是在线,这样就会导致很多问题。

所以需要客户端或者服务器定时的向对方发送心跳包,简单来说,其实心跳包就是一个空消息。 通过发送心跳包,这样服务器才知道客户端目前的状态。到底是服务器向客户端发送心跳包,还是客户端向服务器发送心跳包,哪个效率更高,这是另一个问题,就不在这里分析了。

所以需要客户端或者服务器定时的向对方发送心跳包,简单来说,其实心跳包就是一个空消息。 通过发送心跳包,这样服务器才知道客户端目前的状态。到底是服务器向客户端发送心跳包,还是客户端向服务器发送心跳包,哪个效率更高,这是另一个问题,就不在这里分析了。

总结起来,心跳包,就是让链接长时间保持的一种方式,如果你的程序经常断线,不妨分析一下是不是这个原因。

付老师疑难问答