63

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

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

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


乔——

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

有两件事只是松散相关:

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

交换的 msgs 应该是相对较低的延迟,所以严格来说二进制协议是最好的,但我觉得如果 XMPP 没有引入太多开销以便我可以使用它,然后从它的可扩展性中获益,那么它可能值得探索和以后的灵活性。

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

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

4

10 回答 10

51

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

动作脚本

C

C++

C#/.NET/单声道

二郎

闪光

哈斯克尔

爪哇

JavaScript

语言

Objective-C

Perl

PHP

Python

红宝石

Tcl

于 2008-10-07T08:23:40.900 回答
9

我进行了同样的搜索。我首先尝试了 Smack,然后意识到它针对的是 c2s(客户端到服务器)并且没有我需要的东西。我查看了 Tinder,但不喜欢许可模型(当我看起来它更原始时)。我终于看着 Whack 并意识到这是我需要的——但它缺少很多(我认为这就是 Tinder 出现的原因)。

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

我在此基础上编写了一个 Scala 库来帮助创建基于外部组件的代理,请参阅 http://github.com/Communivity/Shellackhttp://github.com/Communivity/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
  }
}
于 2010-03-11T17:52:17.913 回答
4

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

于 2009-07-16T13:05:20.763 回答
3

同样来自 Ignite Realtime 的是专门用于构建 XMPP 组件的Whack API

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

于 2009-11-18T05:59:25.430 回答
2

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

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

于 2008-10-07T23:01:52.140 回答
1

看一下这个:

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

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

于 2010-04-29T07:16:00.010 回答
1

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

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

于 2012-04-28T09:46:42.640 回答
0

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

于 2012-11-29T15:37:07.990 回答
0

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

于 2013-04-07T10:19:33.960 回答
0

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

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

于 2013-11-12T16:22:17.357 回答