服务器端的 XMPP Java 库不错吗?[已关闭]

2022-08-31 15:43:44

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

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

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


乔 -

好吧,我试图做的事情的答案有点长 - 我会尽量保持简短。

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

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

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

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

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


答案 1

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

操作脚本

C

C++

C# / .NET / 单声道

二郎

闪光

哈斯克尔

爪哇岛

JavaScript

Lisp

目标-C

佩尔

菲律宾比索

红宝石

断续器


答案 2

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

所以。。我的解决方案?Forked 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
  }
}

推荐