我已经设置了简单的服务器和客户端,但我不知道如何将消息从 xmpp 服务器发送到客户端。请给我一些帮助。如果可能的话,建议我一些链接。
1 回答
这是 Vysper 经常遇到的一个问题。提出这个问题有几个原因,我认为一个特别的原因是 HTTP Web 服务器实际上以这样一种方式工作,即它创建内容(HTML、CSS 等)并将其发送到代理(即 Web 浏览器)。
在电子邮件和聊天等基于消息的协议中,这有点不同。
电子邮件由代理(即电子邮件客户端)创建和使用。服务器大多只充当消息代理 (http://en.wikipedia.org/wiki/Message_broker),包括身份验证、过滤、存储等方面。它们很少自己生成自己的电子邮件消息。通常,少数中央帐户(例如 order@acme.com、support@acme.com)创建大部分电子邮件,这意味着实际消息由电子邮件客户端生成并由服务器代表客户端传递。(此外,email/SMTP 具有客户端直接向接收者的电子邮件服务器发送电子邮件的特性,这是一场名为 /spam/ 的噩梦。)
一般来说,XMPP 在这里没有什么区别。XMPP 聊天客户端连接并发送和接收消息。XMPP 服务器代理消息。因此,要回答您的问题,在大多数情况下,建议让一个中央帐户与所有其他帐户进行通信就足够了。这是最简单和最好的解决方案。
然而,XMPP 提供的不仅仅是聊天。它具有基于表单、发布/订阅和管理/命令的类似向导的工作流的扩展。
如果您确实需要,您可以添加自己的扩展程序:
例如,看看这里的 VCard 扩展:http: //svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/扩展/xep0054_vcardtemp/
首先,我建议继承 org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler 这就像通过继承 DefaultServlet 来实现自己的 Servlet。它包含您要提供的 XMPP 节逻辑。
此外,您需要将处理程序插入服务器。这最好按照 VcardTempModule 中的示例来完成,该示例
- 提供一个 Handler 实例并注册它
- 初始化持久性(或您可能需要的任何其他后端连接)
- 使您的扩展程序的命名空间为人所知,并在服务发现中宣布您的 IQ 内容
如果您需要持久性,请查看 VcardTempPersistenceManager。
剩下要做的就是让服务器知道你的模块。如果您使用 Spring,请在 Spring 配置中添加一行。如果您使用嵌入式方法,则需要调用等效于 server.addModule(new VcardTempModule()); 就像在 org.apache.vysper.xmpp.server.ServerMain 中完成的一样
现在,如果您想发出新的节(消息),而不是对通过服务器的其他节的反应,您还需要启动自己的能够创建和发送节的线程。
但同样,首选方法是让客户端创建所有消息。