Хорошие библиотеки Java XMPP для серверов?

Я надеялся внедрить простой сервер XMPP в Java.

Мне нужна библиотека, которая может анализировать и понимать запросы xmpp от клиента. Я посмотрел на Smack (упомянутый ниже) и JSO. По-видимому, Smack является клиентом, поэтому, хотя он может помочь разбору пакетов, он не знает, как реагировать на клиентов. Является ли JSO, он выглядит очень старым. Единственным перспективным направлением является вытащить OpenFire, являющийся целым коммерческим (OSS) сервером XMPP.

Я просто надеялся на несколько строк кода поверх Netty или Mina, поэтому я мог начать обрабатывать некоторые сообщения с провода.


Joe -

Хорошо, ответ на то, что я пытаюсь сделать, несколько длинный - я постараюсь, чтобы он был коротким.

Есть две вещи, которые связаны только с этим:

1) Я хотел написать сервер XMPP, потому что я представляю себе собственный протокол для общения двух клиентов. В основном я думаю о сетевом приложении для iPhone, но я не хотел полагаться на низкоуровневые двоичные протоколы, потому что использование чего-то вроде XMPP означает, что приложение может "быстро расти" из локального приложения на основе Wi-Fi на интернет-основе...

Обмен сообщениями должен быть относительно низким, поэтому, строго говоря, бинарный протокол был бы лучшим, но я чувствовал, что, возможно, стоит изучить, если XMPP не вводит слишком много накладных расходов, чтобы я мог использовать его, а затем воспользоваться преимуществами его расширяемости и гибкости позже.

2) Я работаю на Terracotta - поэтому у меня есть этот сумасшедший согнутый кластер. Как только я начал думать о написании кода пользовательского сервера, я решил, что хочу его сгруппировать. Terracotta делает масштабирование Java POJO тривиальным, поэтому я думал о создании супер простого XMPP-сервера в качестве демонстрационного приложения для Terracotta. В основном каждый пользователь подключается к серверу через TCP-соединение, которое регистрирует пользователя в хэш-карте. У каждого пользователя будет LinkedBlockingQueue с потоком прослушивания, принимающим сообщение из очереди. Затем любой подключенный пользователь, который хочет отправить сообщение любому другому пользователю (например, любому старому чат-приложению), просто выдает сообщение XMPP (как обычно) этому пользователю по соединению. Сервер подбирает его, просматривает соответствующий объект пользователя на карте и помещает сообщение в очередь. Поскольку очередь кластеризована, независимо от того, какой пользователь назначения подключен к тому же физическому серверу или другому физическому серверу, сообщение доставляется, и поток, который прослушивает, подбирает его и отправляет обратно с целевого пользовательского соединения tcp.

Итак - не слишком мало резюме, которого я боюсь. Но это то, что я хочу делать. Полагаю, я мог бы просто написать плагин для Openfire, чтобы выполнить # 1, но я думаю, что он заботится о большом количестве сантехники, поэтому сложнее сделать # 2 (тем более, что я надеялся на очень маленький код, который мог бы вписаться в простой проект 10-20kb Maven).

Ответ 1

http://xmpp.org/xmpp-software/libraries/ имеет список программных библиотек для XMPP. Вот устаревший снимок:

ActionScript

C

С++

С#/.NET/Mono

Erlang

Вспышка

Haskell

Java

JavaScript

Lisp

Objective-C

Perl

PHP

Python

Ruby

Tcl

Ответ 2

Я прошел один и тот же поиск. Сначала я попробовал Smack, а затем понял, что он нацелен на c2s (клиент на сервер) и не имеет того, что мне нужно. Я посмотрел на Тиндера, но мне не нравилась модель лицензирования (также, когда я смотрел, она была намного более сырой). Наконец я посмотрел на Уок и понял, что это то, что мне нужно, но он много не хватает (вот почему Тиндер пришел, как я думаю).

Итак... мое решение? 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
  }
}

Ответ 3

Ignite Realtime делится своим Tinder API, который является основным строительным блоком, извлеченным из OpenFire, только для создания серверных компонентов и, возможно, других сервера. Он реализует базовые строительные блоки XMPP, и вы можете начать с этого момента.

Ответ 4

Также от Ignite Realtime есть Whack API, который специально предназначен для создания компонентов XMPP

Whack - это XMPP с открытым исходным кодом (Jabber) библиотеку компонентов для компонентов XMPP. Чистая библиотека Java, это может быть встроенные в ваши приложения для создать что-нибудь из полного XMPP компонент к простой интеграции XMPP таких как отправка перехвата и воздействуя на определенные сообщения.

Ответ 5

Лучше всего использовать существующий сервер и добавить к нему свои функции. Написание всего сервера с нуля, даже с использованием библиотеки, будет намного сложнее, чем вы ожидаете.

Можете ли вы рассказать нам больше о проблеме, которую вы пытаетесь решить? Затем мы можем указать вам на соответствующий сервер и помочь вам с нужным местом для подключения.

Ответ 6

проверьте это:

это библиотека нижнего уровня. он находится в состоянии инкубации, и, похоже, никто не толкает его. но это отличный api, и я надеюсь, что он будет прогрессировать.

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

Ответ 7

Я думаю, вы уже посмотрели на правильное решение: Openfire

Это не коммерческое решение. Это сервер XMPP поверх Mina и Jetty, написанный на Java, выпущенный под лицензией Apache. Поставляется довольно близко к тому, что вы просили. Хотя я знаю, что вы попросили библиотеку, почему бы не использовать какое-то стабильное разработанное ПО с открытым исходным кодом, которое можно легко расширить, например openfire?

Ответ 9

Посмотрите Vorpal. Его структура Java EE 6, которая реализует протокол XEP-0114.

Ответ 10

Я знаю, что цель состоит в том, чтобы построить небольшой взлом в OP. Однако, если есть хоть какой-то интерес к масштабированию, сквозная безопасность, и т.д. Я бы предложил посмотреть на Soapbox из Coversant. Это наш партнер. Мы используем SMACK на нашей жесткой виртуальной среде реального времени, JamaicaVM для связи с Soapbox.

Кроме того, если целью является соединение с серверным приложением, а не повторное дополнение XMPP-сервер (например, Soapbox), для этого может использоваться клиент SMACK. Он является клиентом сервера XMPP, но экземпляр фактических сообщений может быть от клиента к клиенту через сервер XMPP.