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

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

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

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


乔 -

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

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

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

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

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

所以 - 恐怕总结不会太少。 但那正是我想要做的。 我想我可以为Openfire编写一个插件来完成#1,但我认为它需要处理很多管道工程,所以它很难做到#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
  • Jabber流对象(JSO)
  • 拍击
  • JavaScript的

  • strophe.js
  • xmpp4js
  • 口齿不清

  • CL-XMPP
  • Objective-C的

  • xmppframework
  • Perl的

  • AnyEvent :: XMPP
  • PHP

  • Lightr
  • XMPPHP
  • 蟒蛇

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

  • XMPP4R
  • TCL

  • JabberLib

  • 我经历了同样的搜索。 我第一次尝试Smack,然后意识到它是针对c2s(客户端到服务器),并没有我需要的。 我看着Tinder,但不喜欢授权模式(当我看起来更加生硬时)。 我终于看到了重击,并意识到这是我需要的 - 但它缺少了很多(这就是为什么Tinder出现我认为)。

    所以..我的解决方案? 分叉重击,添加了一些代码来抽象出事情,并尝试使其更易于使用: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,该API是从OpenFire提取的基本构建块,仅用于创建服务器端组件以及可能的其他服务器。 它实现了基本的XMPP构建模块,您可以从这里开始。

    链接地址: http://www.djcxy.com/p/94159.html

    上一篇: Good XMPP Java Libraries for server side?

    下一篇: How to register user on ejabbered using php code