适用于服务器端的良好XMPP Java库



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

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

我只是希望在Netty或Mina上面有几行代码,这样我就可以开始处理一些消息了。


Joe-

好吧,我想做的事情的答案有点长——我会尽量简短。

有两件事是松散相关的:

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

交换的消息应该是相对较低的延迟,所以严格地说,二进制协议是最好的,但我觉得如果XMPP不引入太多开销,这样我就可以使用它,然后从它的可扩展性和灵活性中获得好处,这可能是值得探索的。

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

所以——恐怕不太简短。但这正是我想做的。我想我可以为Openfire编写一个插件来完成#1,但我认为它需要大量的管道,所以很难完成#2(尤其是因为我希望有少量的代码可以放入一个10-20kb的Maven项目中)。

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

ActionScript

  • as3xmpp

C

  • iksemel
  • libstrophe
  • 大声喧哗

C++

  • glox
  • 虹膜
  • oajabber

C#/.NET/Mono

  • agsXMPP SDK
  • jabber net

Erlang

  • Jabberlang

闪光

  • XIFF

Haskell

  • hsxmpp

Java

  • Echomine Feridian
  • Jabber流对象(JSO)
  • Smack

JavaScript

  • strophe.js
  • xmpp4js

Lisp

  • cl-xmpp

Objective-C

  • xmppframework

Perl

  • AnyEvent::XMPP

PHP

  • Lightr
  • xmpphp

Python

  • jabber.py
  • pyxmpp
  • SleekXMPP
  • 扭曲的单词
  • xmpp psn
  • xmpppy

Ruby

  • XMPP4R

Tcl

  • JabberLib

我也进行了同样的搜索。我首先尝试了Smack,然后意识到它是针对c2s(客户端到服务器)的,没有我需要的东西。我看了Tinder,但不喜欢许可模式(当我看的时候,它也更原始)。我终于看到了Whack,意识到这正是我所需要的——但它缺失了很多(我想这就是Tinder出现的原因)。

所以。。我的解决方案?Forked Whack添加了一些代码来抽象事物,并试图使其更易于使用:http://github.com/Communitivity/Adirondack

我在此基础上编写了一个Scala库,以帮助创建基于组件的外部代理,请参阅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中提取的基本构建块,仅用于创建服务器端组件和可能的其他服务器。它实现了基本的XMPP构建块,您可以自由地从那里开始。

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

Whack是一个开源XMPP(Jabber)XMPP组件的组件库。一个纯Java库,它可以嵌入到您的应用程序中从完整的XMPP创建任何内容组件到简单XMPP集成例如发送拦截和对某些信息采取行动。

您最好的选择是使用现有的服务器,并将您的功能添加到其中。从头开始编写整个服务器,即使使用库,也将比您预期的困难很多。

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

请查看:

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

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

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

这不是一个商业解决方案。它是一个XMPP服务器,位于Mina和Jetty之上,使用Apache许可证下发布的Java编写。非常接近你的要求。虽然我知道你要求一个库,为什么不使用一些稳定开发的开源软件,可以像openfire一样轻松扩展呢?

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

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

我知道目的是在OP中构建一个小的破解。然而,如果有兴趣扩展它,端到端安全,等等。我建议看看Coversant的Soapbox。他们是我们的合作伙伴。我们在硬实时虚拟机环境JamaicaVM上使用SMACK与Soapbox进行通信。

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

最新更新