良好的XMPP Java库的服务器端?

我希望在Java中实现一个简单的XMPP服务器。

我需要的是一个可以parsing和理解来自客户端的xmpp请求的库。 我看过Smack(下面提到)和JSO。 Smack似乎只是客户端,所以它可能有助于parsing数据包,但不知道如何响应客户端。 JSO保持它看起来很老。 唯一有希望的途径是将Openfire作为整个商业(OSS)XMPP服务器。

我只是希望在Netty或Mina之上添加几行代码,所以我可以开始处理一些消息。


乔 –

那么我想要做的答案有点长 – 我会尽量保持它的简短。

有两件事情,只是松散的相关:

1)我想编写一个XMPP服务器,因为我想为两个客户端通信编写一个自定义协议。 基本上我正在考虑一个联网的iPhone应用程序 – 但我不想依靠低级的二进制协议,因为使用像XMPP这样的东西意味着应用程序可以很快从本地的基于WiFi的应用程序“长大”到基于互联网的应用程序…

交换的消息应该是相对较低的延迟,所以严格来说二进制协议是最好的,但是我觉得可能值得探讨一下,如果XMPP没有引入太多的开销,以至于我可以使用它,然后从中获得可扩展性和后来的柔韧性。

2)我为兵马俑工作 – 所以我疯狂地集中一切。 一旦我开始考虑编写一些自定义的服务器代码,我想我想集群它。 兵马俑使Java POJOs扩展微不足道,所以我的想法是构build一个超级简单的XMPP服务器作为一个演示应用程序的兵马俑。 基本上每个用户将通过TCP连接连接到服务器,这将注册用户到哈希映射。 每个用户将有一个LinkedBlockingQueue与一个侦听器线程从队列中获取消息。 然后,任何想要发送消息给任何其他用户(如任何旧的聊天应用程序)的连接用户只需通过连接向该用户发送XMPP消息(如往常一样)。 服务器拿起它,在地图中查找相应的用户对象,并将消息放到队列中。 由于队列是群集的,不pipe目标用户是连接到同一个物理服务器还是不同的物理服务器,消息都会被传送,正在侦听的线程会将其拾取并将其发送回目标用户的tcp连接。

所以 – 恐怕不能总结。 但这就是我想要做的。 我想我可以写一个Openfire的插件来完成#1,但是我认为它需要处理很多pipe道,所以很难做到#2(特别是因为我希望有一小部分代码可以适合简单的10-20kb Maven项目)。

http://xmpp.org/xmpp-software/libraries/有一个XMPP软件库列表。; 这是一个过时的快照:

动作脚本

  • as3xmpp

C

  • iksemel
  • libstrophe
  • 大嘴巴

C ++

  • gloox
  • 鸢尾花
  • oajabber

C#/ .NET / Mono

  • agsXMPP SDK
  • 闲聊网

二郎神

  • Jabberlang

  • XIFF

哈斯克尔

  • hsxmpp

Java的

  • Echomine Feridian
  • Jabberstream对象(JSO)
  • 拍击

JavaScript的

  • strophe.js
  • xmpp4js

口齿不清

  • CL-XMPP

Objective-C的

  • xmppframework

Perl的

  • AnyEvent :: XMPP

PHP

  • Lightr
  • XMPPHP

python

  • jabber.py
  • pyxmpp
  • SleekXMPP
  • 扭曲的词
  • XMPP的PSN
  • xmpppy

ruby

  • XMPP4R

TCL

  • JabberLib

我经历了同样的search。 我第一次尝试Smack,然后意识到它是针对C2(客户端到服务器),并没有我所需要的。 我看着Tinder,但不喜欢授权模式(当我看起来更原始)。 我终于看着重击,意识到这是我所需要的 – 但是它错过了很多(这就是为什么Tinder是我想的)。

所以..我的解决scheme? 分叉重击,添加了一些代码来抽象出事情,并尝试使其更容易使用: http : //github.com/Communitivity/Adirondack

我写了一个基于Scala库来帮助创build基于外部组件的代理,请参阅http://github.com/Communitivity/Shellack和http://github.com/Communitivity/MinimalScalaXMPPComponent

我的主要目标之一是快速编写组件。 下面是一个这样的组件的例子:

object Main { /** * @param args the command line arguments */ def main(args: Array[String]) :Unit = { new XMPPComponent( new ComponentConfig() { def secret() : String = { "secret.goes.here" } def server() : String = { "communitivity.com" } def subdomain() : String = { "weather" } def name() : String = { "US Weather" } def description() : String = { "Weather component that also supported SPARQL/XMPP" } }, actor { loop { react { case (pkt:Packet, out : Actor) => Console.println("Received packet...\n"+pkt.toXML) pkt match { case message:Message => val reply = new Message() reply.setTo(message.getFrom()) reply.setFrom(message.getTo()) reply.setType(message.getType()) reply.setThread(message.getThread()) reply.setBody("Received '"+message.getBody()+"', tyvm") out ! reply case _ => Console.println("Received something other than Message") } case _ => Console.println("Received something other than (Packet, actor)") } } } ).start } } 

Ignite Realtime共享其Tinder API ,这是从OpenFire提取的基本构build块,仅用于创build服务器端组件以及可能的其他服务器。 它实现了基本的XMPP构build模块,您可以从这里开始。

Ignite Realtime也是专门用于构buildXMPP组件的Whack API

重击是用于XMPP组件的开源XMPP(Jabber)组件库。 一个纯粹的Java库,它可以embedded到您的应用程序中,从完整的XMPP组件到简单的XMPP集成(例如发送拦截和处理某些消息)创build任何内容。

您最好的select是使用现有的服务器,并添加您的function。 从头开始编写整个服务器,即使使用一个库,也会比预期的难得多。

你能告诉我们更多关于你正试图解决的问题吗? 然后,我们可以将您指向适当的服务器,并帮助您在正确的位置插入。

看一下这个:

这是一个较低级别的库。 它处于孵化状态,似乎没人推动它。 但它是一个伟大的API,我希望它会进步。

http://java.net/project/jso-jabber-stream-objects

我想你已经看到了正确的解决scheme: Openfire

这不是一个商业解决scheme。 这是在Apache许可证下发布的以Java编写的Mina和Jetty之上的XMPP服务器。 跟你要求的东西差不多 虽然我知道你要求一个图书馆,为什么不使用一些稳定开发的开源软件,可以像openfire一样轻松扩展?

我发现了一个很好的基于Java的xmpp服务器: http : //www.tigase.org/

看看Vorpal 。 它是一个实现XEP-0114协议的Java EE 6框架。

我知道这样做的目的是在OP中构build一个小黑客。 然而,如果有兴趣扩展它,端到端的安全性等,我会build议从Coversant看Soapbox。 他们是我们的伙伴。 我们在硬实时虚拟机环境(即JamaicaVM)上使用SMACK与Soapbox进行通信。

此外,如果意图是与服务器应用程序进行通信,而不是重新实现XMPP服务器(例如Soapbox),则可以使用SMACK客户端。 它是XMPP服务器的客户端,但实际通信的实例可以通过XMPP服务器从客户端到客户端。