Question

J'espérais implémenter un serveur XMPP simple en Java.

Il me faut une bibliothèque capable d'analyser et de comprendre les demandes xmpp d'un client. J'ai regardé Smack (mentionné ci-dessous) et JSO. Smack semble être uniquement client. Bien que cela puisse 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 solution prometteuse consiste à séparer Openfire, qui est un serveur XMPP complet (commercial).

J'espérais quelques lignes de code au-dessus de Netty ou de Mina afin de pouvoir commencer à traiter certains messages sur le réseau.

Joe -

Eh bien, la réponse à ce que j'essaie de faire est un peu longue. Je vais essayer de faire court.

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 gros, je pense à une application iPhone en réseau, mais je ne voulais pas m'appuyer 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 wifi locale à une application internet ...

Les msgs échangés doivent être de latence relativement faible, donc un protocole binaire à proprement parler serait préférable, mais j’ai pensé qu’il serait intéressant d’explorer si XMPP n'introduisait pas trop de temps système afin que je puisse l’utiliser et en tirer des avantages. de son extensibilité et de sa flexibilité plus tard.

2) Je travaille pour Terracotta. J'ai donc cette idée folle de tout regrouper. Dès que j'ai commencé à penser à écrire du code serveur personnalisé, je me suis dit que je voulais le mettre en cluster. Terracotta rend la mise à l'échelle des POJO Java triviale. Mon idée était donc de 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 l'enregistrerait dans un hashmap. Chaque utilisateur aurait une LinkedBlockingQueue avec un fil d'écoute prenant le message de la file d'attente. Ensuite, tout utilisateur connecté qui souhaite envoyer un message à un autre utilisateur (par exemple, une ancienne application de discussion en ligne) 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. Étant donné que la file d'attente 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 la récupère et le renvoie à 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 juste écrire un plugin pour Openfire afin d’accomplir la première tâche, mais je pense qu’elle prend beaucoup de temps pour la plomberie, c’est donc plus difficile de faire la deuxième. simple projet Maven 10-20kb).

Autres conseils

J'ai effectué la même recherche. J'ai d'abord essayé Smack, puis j'ai réalisé qu'il ciblait les C2 (client à serveur) et que je n'avais pas ce dont j'avais besoin. J'ai regardé Tinder mais je n'ai pas aimé le modèle de licence (aussi quand je l'ai regardé, c'était beaucoup plus brut). J'ai finalement regardé Whack et réalisé que c'était ce dont j'avais besoin - mais il en manque beaucoup (c'est pourquoi Tinder est arrivé, je pense).

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

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

L'un de mes objectifs principaux était de faciliter l'écriture rapide d'un composant. Vous trouverez ci-dessous un exemple d'un tel composant:

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
  }
}

Ignite Realtime partage son API Tinder , 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 partir de là.

L’autre API Whack , également créée pour Ignite Realtime, est également destinée à la construction. Composants XMPP

  

Whack est un XMPP Open Source (Jabber)   bibliothèque de composants pour les composants XMPP.   Une bibliothèque Java pure, ça peut être   intégré à vos applications pour   créer quoi que ce soit à partir d'un XMPP complet   composant pour les intégrations XMPP simples   tels que l'envoi d'intercepter et   agir sur certains messages.

Votre meilleur choix est d'utiliser un serveur existant et d'y ajouter vos fonctionnalités. Écrire un serveur entier à partir de rien, même en utilisant une bibliothèque, va être un lot plus difficile que prévu.

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

vérifiez ceci:

c'est une bibliothèque de niveau inférieur. il est en incubation et il semble que personne ne le pousse. mais c’est une excellente api et j’espère que cela progressera.

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

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

Ce n'est pas une solution commerciale. C'est un serveur XMPP au-dessus de Mina et Jetty écrit en Java et distribué sous la licence Apache. Vient assez près de ce que vous avez demandé. 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?

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

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

Je sais que l’intention est de construire un petit bidouillage dans le PO. Cependant, s’il ya un intérêt à le faire évoluer, une 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 de machine virtuelle en temps réel, JamaicaVM, pour communiquer avec Soapbox.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top