服务器端使用的好的XMPP Java库是什么?

63

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

我需要一个库,可以解析和理解来自客户端的xmpp请求。我看过Smack(如下所述)和JSO。Smack似乎仅适用于客户端,因此它可能有助于解析数据包,但不知道如何响应客户端。JSO是否维护良好,看起来非常古老。唯一有希望的途径是拆开Openfire,这是一个完整的商业(OSS)XMPP服务器。

我只希望能够在Netty或Mina上面添加几行代码,以便我可以开始处理一些离线消息。


Joe -

我想做两件事情,它们只有松散的联系:

1)我想编写一个XMPP服务器,因为我想象编写一个自定义协议,使两个客户端进行通信。基本上我考虑的是一个网络化的iPhone应用程序-但我不想依赖低级二进制协议,因为使用类似XMPP的东西意味着该应用程序可以非常快地从基于本地wifi的应用程序成长为基于互联网的应用程序......

交换的消息应该是相对较低的延迟,因此严格来说二进制协议最好,但我觉得如果XMPP没有引入太多开销,那么值得探讨,以后可以利用它的可扩展性和灵活性受益。

2) 我在Terracotta工作,所以我有这种将所有东西进行集群的疯狂倾向。一旦我开始考虑编写一些自定义服务器代码,我就想将其集群化。Terracotta使得Java POJOs的扩展变得微不足道,因此我的想法是为Terracotta构建一个超级简单的XMPP服务器演示应用程序。基本上,每个用户都会通过TCP连接连接到服务器,将用户注册到哈希图中。每个用户都有一个LinkedBlockingQueue,其中一个监听线程从队列中获取消息。然后,任何想要向任何其他用户发送消息(例如任何旧聊天应用程序)的连接用户都只需通过连接向该用户发出XMPP消息(像往常一样)。服务器接收到它后,在映射中查找相应的用户对象,并将消息放入队列中。由于队列是集群的,因此无论目标用户是连接到同一物理服务器还是不同的物理服务器,消息都会被传送,并且正在侦听的线程将其捕获并将其发送回目标用户的TCP连接。

因此,我希望做的事情并不太简短。但那就是我想做的事情。我想我可以只为Openfire编写一个插件来完成#1,但我认为它会处理很多管道,因此更难完成#2(特别是因为我希望有一个非常少量的代码可以适合于简单的10-20kb Maven项目)。


1
我也看了Smack - 但不知怎么的,我觉得它只适用于客户端连接 - 我错了吗? - Taylor Gautier
我的有限经验表明,XMPP 服务器和客户端之间几乎没有太大的区别。希望你能自己处理服务器套接字(用Java很简单),然后使用 Smack 处理 XMPP 流。 - skaffman
它是一个客户端库。你为什么不使用OpenFire而自己写呢? - Robin
2
因为我正在寻找的是一个开发平台,而不是一个预先配置好的服务器。Openfire看起来很棒 - 不要误解我的意思 - 用于运行真实系统非常好。但这并不是我真正想要的 - 我正在寻找的是进行编程开发。 - Taylor Gautier
10个回答

51

http://xmpp.org/xmpp-software/libraries/ 提供了一份XMPP软件库列表。以下是一个过时的快照:

ActionScript

C

C++

C# / .NET / Mono

Erlang

Flash

Haskell

Java

JavaScript

Lisp

Objective-C

Perl

PHP

Python

Ruby

Tcl


Google App Engine还提供Python、Java和Go XMPP库:https://developers.google.com/appengine/docs/java/xmpp/ - Ky -
嗨@prakash。我一直在尝试创建一个XMPPConnection,但是连接失败了。不过XMPPServer启动正常。你能否请看一下我的问题这里,看看是否可以帮忙?非常感谢。 - Program-Me-Rev

9
我经历了同样的搜索。我首先尝试了Smack,但意识到它是针对c2s(客户端到服务器)的,并且没有我需要的功能。我看了一下Tinder,但不喜欢许可模式(而且当我看的时候它还比较简陋)。最后我看了Whack,意识到这就是我需要的——但它缺少很多东西(这就是我认为Tinder出现的原因)。
所以...我的解决方案?分叉Whack,添加一些代码来抽象出东西,并尝试使其更易于使用:http://github.com/Communitivity/Adirondack
我基于此编写了一个Scala库,帮助创建基于外部组件的代理,请参见http://github.com/Communitivity/Shellackhttp://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
  }
}

嗨@Bill,我很新于XMPP,我们正在研究是否可以将其用于我们的项目。我看到了你写的一些东西,"我最初尝试了Smack,然后意识到它针对的是c2s(客户端到服务器),并且没有我所需要的内容。",这引起了我的注意。你是指使用客户端上的aSmack不能从服务器向客户端推送通知吗?我认为我们必须使用其他库来处理服务器端。 - mdelolmo
1
嗨@mdelolmo,欢迎来到XMPP世界!Smack是为客户端设计的。如果您要编写服务器或外部组件,则Smack可能不是最佳选择。据我所知,Whack是他们的服务器端库。话虽如此……如果您在客户端使用Smack,而服务器上有任何正常的XMPP通信,则Smack将能够理解它。IgniteRealtime非常专注于其Flash产品,因此我不知道它的当前情况。现在我的大部分工作都是在Erlang或Node中进行的。 - Bill Barnhill
一些URL移动: https://github.com/Java-Communitivity/Adirondack https://github.com/Java-Communitivity/Shellack https://github.com/Java-Communitivity/MinimalScalaXMPPComponent这些存储库的自述文件会很不错 :) - tg44

4

Ignite Realtime分享了它的Tinder API。这是从OpenFire中提取出来的基本构件,仅用于创建服务器端组件和其他服务器。它实现了基本的XMPP构建块,并且您可以从这里开始。


3

Ignite Realtime还提供了Whack API, 该API专门用于构建XMPP组件

Whack是一个开源的XMPP(Jabber)组件库,可用于构建XMPP组件。它是一个纯Java库,可以嵌入到您的应用程序中,创建从完整的XMPP组件到简单的XMPP集成,例如发送、拦截和处理某些消息。


2

最好的选择是使用现有的服务器,并在其上添加功能。即使使用库,从头开始编写整个服务器也比你预期的要困难得多。

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


嗨,@Joe Hildebrand。我一直在尝试创建一个XMPPConnection,但是连接失败了。不过,XMPPServer启动正常。您能否请看一下我的问题这里,看看是否可以帮忙?非常感谢您的帮助。 - Program-Me-Rev

1

1

我认为你已经找到了正确的解决方案:Openfire

它不是商业解决方案,而是一个基于Java编写的XMPP服务器,基于Mina和Jetty,并在Apache许可下发布。非常接近你所要求的内容。 虽然我知道你要求一个库,但为什么不使用一些稳定的开源软件,比如openfire,它可以很容易地扩展呢?


嗨@Flow。我一直在尝试创建一个XMPPConnection,但是连接失败了。不过XMPPServer启动正常。你能否请看一下我的问题这里,看看是否可以帮忙?非常感谢。 - Program-Me-Rev
那个链接是404。你能检查一下吗? - Joe Hildebrand

0

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


0

0

我知道意图是在OP中构建一个小的黑客。但是,如果有兴趣扩展它、实现端到端的安全等等,我建议看一下Coversant的Soapbox。他们是我们的合作伙伴。我们在我们的硬实时虚拟机环境JamaicaVM上使用SMACK与Soapbox通信。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接