Bonnes bibliothèques Java XMPP côté serveur?

J’espérais mettre en place un simple serveur XMPP en Java.

Ce dont j’ai besoin, c’est d’une bibliothèque capable d’parsingr et de comprendre les requêtes xmpp provenant d’un client. J’ai regardé Smack (mentionné ci-dessous) et JSO. Smack ne semble être client que si cela peut aider à parsingr les paquets, mais il ne sait pas comment répondre aux clients. Est-ce que JSO a maintenu qu’il a l’air très vieux. La seule voie prometteuse consiste à séparer Openfire, qui est un serveur XMPP commercial complet (OSS).

J’espérais juste quelques lignes de code sur Netty ou Mina, afin que je puisse commencer à traiter des messages en différé.


Joe –

Eh bien, la réponse à ce que j’essaye de faire est un peu longue – je vais essayer de restr brève.

Il y a deux choses qui ne sont que vaguement liées:

1) Je voulais écrire un serveur XMPP parce que j’imagine écrire un protocole personnalisé pour que deux clients puissent communiquer. Fondamentalement, je pense à une application iPhone en réseau – mais je ne voulais pas compter sur les protocoles binarys de bas niveau car l’utilisation de quelque chose comme XMPP permet à l’application de «grandir» très rapidement d’une application wifi locale à une application Internet. …

Les msgs échangés devraient être relativement à faible latence, de sorte qu’un protocole binary serait à proprement parler le meilleur, mais je pensais qu’il serait intéressant d’explorer si XMPP n’introduisait pas trop de surcharge pour pouvoir l’utiliser et en tirer des avantages. et la flexibilité plus tard.

2) Je travaille pour Terracotta – j’ai donc cette folie courbée pour tout regrouper. Dès que j’ai commencé à penser à écrire du code serveur personnalisé, j’ai pensé que je voulais le regrouper. La terre cuite rend sortingvial la mise à l’échelle de Java POJO, alors je pensais créer un serveur XMPP super simple en tant qu’application de démonstration pour Terracotta. Fondamentalement, chaque utilisateur se connecterait au serveur via une connexion TCP, ce qui enregistrerait l’utilisateur dans un hashmap. Chaque utilisateur aurait un LinkedBlockingQueue avec un thread d’écoute prenant un message de la queue. Ensuite, tout utilisateur connecté qui souhaite envoyer un message à un autre utilisateur (par exemple, une ancienne application de discussion) envoie simplement un message XMPP (comme d’habitude) à cet utilisateur via la connexion. Le serveur le récupère, recherche l’object utilisateur correspondant dans une carte et place le message dans la queue. Étant donné que la queue est en cluster, que l’utilisateur de destination soit connecté au même serveur physique ou à un serveur physique différent, le message est remis et le thread qui l’écoute le récupère et le renvoie à la connexion TCP de l’utilisateur cible.

Donc, pas trop court d’un résumé, j’ai peur. Mais c’est ce que je veux faire. Je suppose que je pourrais simplement écrire un plugin pour Openfire pour accomplir le n ° 1 mais je pense que cela prend soin de beaucoup de plomberie donc c’est plus difficile de faire le n ° 2 (d’autant plus que j’espérais une petite quantité de code projet simple 10-20kb Maven).

    http://xmpp.org/xmpp-software/libraries/ contient une liste de bibliothèques de logiciels pour XMPP. Voici un instantané obsolète de celui-ci:

    ActionScript

    • as3xmpp

    C

    • iksemel
    • libstrophe
    • Grande gueule

    C ++

    • gloox
    • Iris
    • oajabber

    C # / .NET / Mono

    • agsXMPP SDK
    • jabber-net

    Erlang

    • Jabberlang

    Flash

    • XIFF

    Haskell

    • hsxmpp

    Java

    • Echomine Feridian
    • Jabber Stream Objects (JSO)
    • Claque

    JavaScript

    • strophe.js
    • xmpp4js

    Zézayer

    • cl-xmpp

    Objectif c

    • xmppframework

    Perl

    • AnyEvent :: XMPP

    PHP

    • Lightr
    • xmpphp

    Python

    • jabber.py
    • pyxmpp
    • SleekXMPP
    • Mots tordus
    • xmpp-psn
    • xmpppy

    Rubis

    • XMPP4R

    Tcl

    • JabberLib

    Je suis passé par la même recherche. J’ai d’abord essayé Smack puis j’ai réalisé qu’il était ciblé sur c2s (client à serveur) et que je n’avais pas ce dont j’avais besoin. J’ai regardé Tinder mais je n’aimais pas le modèle de licence (même quand je regardais, c’était beaucoup plus brut). J’ai finalement regardé Whack et j’ai réalisé que c’était ce dont j’avais besoin – mais il manque beaucoup (c’est pour ça que Tinder est arrivé, je pense).

    Alors, ma solution? Forked Whack, a ajouté du code pour extraire des choses, et essayer de le rendre plus facile à utiliser: http://github.com/Communitivity/Adirondack

    J’ai écrit une bibliothèque Scala basée sur cela pour aider à créer des agents externes basés sur des composants, voir http://github.com/Communitivity/Shellack et http://github.com/Communitivity/MinimalScalaXMPPComponent

    L’un de mes principaux objectives était de faciliter l’écriture rapide d’un composant. Un exemple d’un tel composant est ci-dessous:

    object Main { /** * @param args the command line arguments */ def main(args: Array[Ssortingng]) :Unit = { new XMPPComponent( new ComponentConfig() { def secret() : Ssortingng = { "secret.goes.here" } def server() : Ssortingng = { "communitivity.com" } def subdomain() : Ssortingng = { "weather" } def name() : Ssortingng = { "US Weather" } def description() : Ssortingng = { "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 partage son API Tinder qui est un bloc de base extrait d’OpenFire uniquement pour la création de composants côté serveur et éventuellement d’autres serveurs. Il implémente les blocs de construction XMPP de base et vous êtes libre de partir de là.

    De même, Ignite Realtime contient l’API Whack qui est spécifiquement conçue pour la construction de composants XMPP.

    Whack est une bibliothèque de composants Open Source XMPP (Jabber) pour les composants XMPP. Une bibliothèque Java pure, elle peut être intégrée à vos applications pour créer un composant XMPP complet ou des intégrations XMPP simples telles que l’envoi d’interception et l’action sur certains messages.

    Votre meilleur pari est d’utiliser un serveur existant et d’y append vos fonctionnalités. Écrire un serveur entier à partir de zéro, même en utilisant une bibliothèque, sera beaucoup plus difficile que prévu.

    Pouvez-vous nous en dire plus sur le problème que vous essayez de résoudre? Nous pouvons alors vous diriger vers un serveur approprié et vous aider à vous connecter au bon endroit.

    regarde ça:

    c’est une bibliothèque de niveau inférieur. il est en état d’incubation et il semble que personne ne le pousse. mais c’est un super api et j’espère que ça progressera.

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

    Je pense que vous avez déjà examiné la bonne solution: Openfire

    Ce n’est pas une solution commerciale. C’est un serveur XMPP sur Mina et Jetty écrit en Java sous la licence Apache. Se rapproche de ce que vous avez demandé. Bien que je sache que vous avez demandé une bibliothèque, pourquoi ne pas utiliser des logiciels open source stables pouvant facilement être étendus comme OpenFire?

    J’ai trouvé un bon serveur xmpp basé sur Java: http://www.tigase.org/

    Regardez Vorpal . C’est un framework Java EE 6 qui implémente le protocole XEP-0114.

    Je sais que l’intention est de créer un petit hack dans l’OP. Cependant, si vous êtes intéressé par une mise à l’échelle, une sécurité de bout en bout, etc., je suggérerais de consulter Soapbox de Coversant. Ils sont notre partenaire. Nous utilisons SMACK sur notre environnement de machine virtuelle temps réel dur, JamaicaVM pour communiquer avec Soapbox.

    En outre, si le but est de communiquer avec une application serveur et de ne pas réimplémenter un serveur XMPP (par exemple, Soapbox), le client SMACK peut être utilisé pour cela. C’est un client du serveur XMPP, mais l’instance des communications réelles peut être du client au client via le serveur XMPP.