web-dev-qa-db-fra.com

Bon XMPP Java Bibliothèques côté serveur?

J'espérais implémenter un simple serveur XMPP 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 regardé Smack (mentionné ci-dessous) et JSO. Smack semble être uniquement client, alors même s'il peut aider à analyser les paquets, il ne sait pas comment répondre aux clients. Est-ce que JSO maintient qu'il a l'air très vieux. La seule avenue prometteuse est de séparer Openfire qui est un serveur XMPP commercial complet (OSS).

J'espérais juste quelques lignes de code au-dessus de Netty ou Mina, afin que je puisse commencer à traiter certains messages hors du fil.


Joe -

Eh bien, 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 car j'imagine écrire un protocole personnalisé pour que deux clients communiquent. Fondamentalement, je pense à une application iPhone en réseau - mais je ne voulais pas compter sur des protocoles binaires de bas niveau, car l'utilisation de quelque chose comme XMPP signifie que l'application peut "grandir" très rapidement d'une application basée sur le wifi local à une application basée sur Internet ...

Les msgs échangés devraient être à latence relativement faible, donc à proprement parler un protocole binaire serait le meilleur, mais je pensais qu'il valait la peine d'explorer si XMPP n'introduisait pas trop de surcharge de manière à ce que je puisse l'utiliser et ensuite profiter des avantages de son extensibilité et la 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 pensé que je voulais le mettre en cluster. Terracotta rend la mise à l'échelle Java POJOs triviale, donc ma pensée était de construire un serveur XMPP super simple comme application de démonstration pour Terracotta. Fondamentalement, chaque utilisateur se connecte au serveur via un TCP, qui enregistrerait l'utilisateur dans une table de hachage. Chaque utilisateur aurait un LinkedBlockingQueue avec un thread d'écoute prenant un message de la file d'attente. Ensuite, tout utilisateur connecté qui souhaite envoyer un message à un autre utilisateur (par exemple, n'importe quel ancien 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. Puisque la file d'attente est en cluster, indépendamment de que l'utilisateur de destination soit connecté au même serveur physique ou à un autre serveur physique, le message est remis et le thread qui l'écoute le récupère et le renvoie sur la connexion TCP de l'utilisateur de destination.

Donc - pas trop court d'un résumé, je le crains. 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 en charge beaucoup de plomberie, donc c'est plus difficile à faire # 2 (d'autant plus que j'espérais une très petite quantité de code qui pourrait tenir dans un projet Maven simple de 10 à 20 Ko).

61
Taylor Gautier
51
prakash

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

Alors ... ma solution? Forked Whack, a ajouté du code pour résumer les 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 basés sur des composants externes, voir http://github.com/Communitivity/Shellack et 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
  }
}
8
Bill Barnhill

Ignite Realtime partage son API Tinder qui est un bloc de construction 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 commencer à partir de là.

4
smokku

Également de Ignite Realtime est le Whack API qui est spécifiquement 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 Java pure, elle peut être intégrée dans vos applications pour créer n'importe quoi, d'un composant XMPP complet à de simples intégrations XMPP telles que l'envoi d'interception et l'action sur certains messages.

3
James Webster

Le mieux 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 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 avec le bon endroit pour vous connecter.

2
Joe Hildebrand

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

Ce n'est pas une solution commerciale. Il s'agit d'un serveur XMPP au-dessus de Mina et Jetty écrit en Java publié sous la licence Apache. Se rapproche assez de Bien que je sache que vous avez demandé une bibliothèque, pourquoi ne pas utiliser un logiciel open source développé et stable qui peut facilement être étendu comme openfire?

1
Flow

regarde ça:

il s'agit d'une bibliothèque de niveau inférieur. il est en incubation et il semble que personne ne le pousse. mais c'est un super api et j'espère qu'il progressera.

http://Java.net/project/jso-Jabber-stream-objects

1
ely

Jetez un oeil à Vorpal . Il s'agit d'un framework Java EE 6 qui implémente le protocole XEP-0114.

0
Chuk Lee

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

0
why

Je sais que l'intention est de construire un petit hack dans le PO. Cependant, s'il y a un intérêt à le faire évoluer, à la sécurité de bout en bout, etc. Je suggérerais de regarder Soapbox de Coversant. Ils sont notre partenaire. Nous utilisons SMACK sur notre environnement dur de machine virtuelle en temps réel, JamaicaVM pour communiquer avec Soapbox.

De plus, si l'intention est de communiquer avec une application serveur et non de réimplémenter un serveur XMPP (par exemple Soapbox), le client SMACK peut être utilisé pour cela. Il s'agit d'un client vers le serveur XMPP, mais l'instance de communications réelles peut être d'un client à un autre via le serveur XMPP.

0
user2962207