61 votes

Bonnes librairies Java XMPP pour le côté serveur ?

J'espérais pouvoir mettre en œuvre un serveur XMPP simple en Java.

Ce dont j'ai besoin, c'est d'une bibliothèque qui puisse analyser et comprendre les requêtes xmpp d'un client. J'ai examiné Smack (mentionné ci-dessous) et JSO. Smack semble n'être qu'un client, donc bien qu'il puisse aider à analyser les paquets, il ne sait pas comment répondre aux clients. JSO est-il maintenu, il semble très vieux. La seule voie prometteuse est de démonter Openfire qui est un serveur XMPP entièrement commercial (OSS).

J'espérais juste avoir quelques lignes de code en plus de Netty ou Mina, afin de pouvoir commencer à traiter des messages sur le fil.


Joe -

La réponse à ce que j'essaie de faire est un peu longue - je vais essayer d'être bref.

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. En fait, je pense à une application iPhone en réseau - mais je ne voulais pas m'appuyer sur des protocoles binaires de bas niveau parce que l'utilisation de quelque chose comme XMPP signifie que l'application peut "grandir" très rapidement d'une application locale basée sur le wifi à une application basée sur Internet...

Les messages échangés doivent avoir une latence relativement faible, donc à proprement parler, un protocole binaire serait préférable, mais j'ai pensé qu'il pourrait être intéressant d'explorer si XMPP n'introduisait pas trop de frais généraux, de sorte que je pourrais l'utiliser et bénéficier de son extensibilité et de sa flexibilité plus tard.

2) Je travaille pour Terracotta - j'ai donc cette tendance folle à tout regrouper. Dès que j'ai commencé à penser à écrire du code serveur personnalisé, j'ai compris que je voulais le mettre en cluster. Terracotta rend la mise à l'échelle des POJO Java triviale, alors j'ai eu l'idée de construire un serveur XMPP super simple comme application de démonstration pour Terracotta. En gros, chaque utilisateur se connectait au serveur par une connexion TCP, qui enregistrait l'utilisateur dans un hashmap. Chaque utilisateur aurait une LinkedBlockingQueue avec un thread d'écoute prenant les messages de la queue. Ensuite, tout utilisateur connecté qui souhaite envoyer un message à un autre utilisateur (par exemple, une ancienne application de chat) envoie simplement un message XMPP (comme d'habitude) à cet utilisateur via la connexion. Le serveur le récupère, recherche l'objet utilisateur correspondant dans une carte et place le message dans la file d'attente. Comme la file d'attente est groupée, que l'utilisateur de destination soit connecté au même serveur physique ou à un serveur physique différent, le message est délivré et le thread qui écoute le récupère et le renvoie sur la connexion tcp de l'utilisateur de destination.

Donc - un résumé pas trop court, j'en ai peur. Mais c'est ce que je veux faire. Je suppose que je pourrais simplement écrire un plugin pour Openfire pour accomplir le #1 mais je pense qu'il prend soin de beaucoup de plomberie donc il est plus difficile de faire le #2 (surtout que j'espérais une très petite quantité de code qui pourrait tenir dans un simple projet Maven de 10-20kb).

51voto

prakash Points 18075

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

ActionScript

C

C++

C# / .NET / Mono

Erlang

Flash

Haskell

Java

JavaScript

Lisp

Objectif-C

Perl

PHP

Python

Ruby

Tcl

8voto

Bill Barnhill Points 391

J'ai fait la même recherche. J'ai d'abord essayé Smack, puis j'ai réalisé qu'il était destiné aux c2s (client à serveur) et qu'il n'avait pas ce dont j'avais besoin. J'ai regardé Tinder mais je n'ai pas aimé le modèle de licence (de plus, quand j'ai regardé, 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 de choses (c'est pourquoi Tinder est apparu, je pense).

Alors ma solution ? J'ai récupéré Whack, ajouté un peu de code pour rendre les choses abstraites, et essayé 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 y http://github.com/Communitivity/MinimalScalaXMPPComponent

L'un de mes principaux objectifs é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[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
  }
}

4voto

smoku Points 61

Ignite Realtime partage son API de Tinder qui est un bloc de construction de base extrait d'OpenFire juste pour la création de composants côté serveur et éventuellement d'autres serveurs. Il met en œuvre les blocs de construction de base de XMPP et vous êtes libre de commencer à partir de là.

3voto

James Webster Points 2590

Le programme Ignite Realtime comprend également Whack API qui est spécifiquement destiné à la construction de composants XMPP

Whack est un XMPP (Jabber) open source. pour les composants XMPP. Une bibliothèque purement Java, elle peut être intégrée dans vos applications pour créer n'importe quoi, d'un composant XMPP à de simples intégrations XMPP telles que l'envoi, l'interception et agir sur certains messages.

2voto

Joe Hildebrand Points 6666

Votre meilleure chance est d'utiliser un serveur existant, et d'y ajouter vos fonctionnalités. Écrire un serveur entier à partir de zéro, même en utilisant une bibliothèque, va être une tâche difficile. lot plus difficile que vous ne le pensez.

Pouvez-vous nous en dire plus sur le problème que vous essayez de résoudre ? Nous pourrons alors vous orienter vers un serveur approprié, et vous aider à trouver le bon endroit pour vous brancher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X