Frage

Ich hatte gehofft, einen einfachen XMPP-Server in Java implementieren zu können.

Was ich brauche, ist eine Bibliothek, die xmpp-Anfragen eines Clients analysieren und verstehen kann.Ich habe mir Smack (unten erwähnt) und JSO angesehen.Smack scheint nur für den Client gedacht zu sein. Obwohl es beim Parsen von Paketen hilfreich sein kann, weiß es nicht, wie es auf Clients reagieren soll.Wird JSO gepflegt, sieht es sehr alt aus.Der einzig erfolgversprechende Weg besteht darin, Openfire, einen vollständigen kommerziellen (OSS) XMPP-Server, auseinanderzunehmen.

Ich hatte nur auf ein paar Codezeilen zusätzlich zu Netty oder Mina gehofft, damit ich mit der Verarbeitung einiger Nachrichten außerhalb der Leitung beginnen konnte.


Joe -

Nun, die Antwort auf das, was ich versuche, ist etwas lang – ich werde versuchen, sie kurz zu halten.

Es gibt zwei Dinge, die nur lose miteinander zusammenhängen:

1) Ich wollte einen XMPP-Server schreiben, weil ich mir vorstelle, ein benutzerdefiniertes Protokoll für die Kommunikation zweier Clients zu schreiben.Grundsätzlich denke ich an eine vernetzte iPhone-App – aber ich wollte mich nicht auf Low-Level-Binärprotokolle verlassen, da die Verwendung von etwas wie XMPP bedeutet, dass die App sehr schnell von einer lokalen WLAN-basierten App zu einer internetbasierten App „wachsen“ kann ...

Die ausgetauschten Nachrichten sollten eine relativ geringe Latenz haben, daher wäre streng genommen ein Binärprotokoll am besten, aber ich hatte das Gefühl, dass es sich lohnen könnte, es auszuprobieren, wenn XMPP nicht zu viel Overhead mit sich bringt, so dass ich es verwenden und dann von seiner Erweiterbarkeit profitieren könnte und Flexibilität später.

2) Ich arbeite für Terracotta – also habe ich die verrückte Neigung, alles zu gruppieren.Als ich darüber nachdachte, benutzerdefinierten Servercode zu schreiben, kam mir sofort der Gedanke, dass ich ihn gruppieren wollte.Terracotta macht die Skalierung von Java-POJOs trivial, daher war mein Gedanke, einen supereinfachen XMPP-Server als Demonstrations-App für Terracotta zu erstellen.Grundsätzlich würde sich jeder Benutzer über eine TCP-Verbindung mit dem Server verbinden, wodurch der Benutzer in einer Hashmap registriert würde.Jeder Benutzer hätte eine LinkedBlockingQueue mit einem Listener-Thread, der Nachrichten aus der Warteschlange entgegennimmt.Dann kann jeder verbundene Benutzer, der eine Nachricht an einen anderen Benutzer senden möchte (z. B.(jede alte Chat-Anwendung) sendet einfach (wie üblich) eine XMPP-Nachricht an diesen Benutzer über die Verbindung.Der Server holt sie ab, sucht in einer Karte nach dem entsprechenden Benutzerobjekt und stellt die Nachricht in die Warteschlange.Da die Warteschlange geclustert ist, wird die Nachricht unabhängig davon, ob der Zielbenutzer mit demselben physischen Server oder einem anderen physischen Server verbunden ist, zugestellt, und der Thread, der sie abhört, nimmt sie auf und sendet sie über die TCP-Verbindung des Zielbenutzers zurück.

Also – ich fürchte, es ist keine allzu kurze Zusammenfassung.Aber genau das möchte ich tun.Ich schätze, ich könnte einfach ein Plugin für Openfire schreiben, um Nummer 1 zu erreichen, aber ich denke, es nimmt viel Arbeit in Anspruch, sodass es schwieriger ist, Nummer 2 zu erledigen (vor allem, weil ich auf eine sehr kleine Menge Code gehofft hatte, die in ein passt einfaches 10-20kb Maven-Projekt).

War es hilfreich?

Lösung

http://xmpp.org/xmpp-software/libraries/ hat eine Liste von Software -Bibliotheken für XMPP. Hier ist ein veraltet Schnappschuss davon:

Aktionen

C

C ++

C# / .net / mono

Erlang

Blinken

Haskell

Java

JavaScript

Lispeln

Ziel c

Perl

Php

Python

Rubin

Tcl

Andere Tipps

Ich habe die gleiche Suche durchgeführt. Ich habe zuerst Smack ausprobiert und dann festgestellt, dass es sich an C2S (Client to Server) richtet und nicht das hatte, was ich brauche. Ich sah Tinder an, mochte das Lizenzmodell aber nicht (auch als ich aussah, dass es viel roher war). Ich habe schließlich Whack angesehen und festgestellt, dass es das war, was ich brauchte - aber es fehlt sehr (deshalb kam Tinder, denke ich).

Also ... meine Lösung? Forked Whack, etwas Code hinzugefügt, um Dinge abstrahieren und versuchen, die Verwendung zu erleichtern: http://github.com/communitivity/adirondack

Ich habe eine Scala -Bibliothek geschrieben, basierend darauf, um externe Komponentenbasis zu erstellen, siehehttp://github.com/communitivity/shellackund http://github.com/communitivity/minimalscalaxmppcomponent

Eines meiner Hauptziele war es, es einfach zu machen, eine Komponente schnell zu schreiben. Ein Beispiel für eine solche Komponente ist unten:

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 teilt seine Tinder-API Dabei handelt es sich um einen aus OpenFire extrahierten Grundbaustein, der nur für die Erstellung serverseitiger Komponenten und möglicherweise anderer Server dient.Es implementiert grundlegende XMPP-Bausteine ​​und Sie können von dort aus beginnen.

Auch von Ignite Echtzeit ist die Whack API Dies ist speziell zum Erstellen von XMPP -Komponenten geeignet

Whack ist eine Open Source XMPP (JABBER) -Komponentenbibliothek für XMPP -Komponenten. Eine reine Java -Bibliothek kann in Ihre Anwendungen eingebettet werden, um alles von einer vollständigen XMPP -Komponente bis hin zu einfachen XMPP -Integrationen zu erstellen, z. B. das Senden von Abfangen und Handeln auf bestimmte Nachrichten.

Am besten verwenden Sie einen vorhandenen Server und fügen Sie Ihre Funktionen hinzu. Das Schreiben eines gesamten Servers von Grund auf, auch wenn sie eine Bibliothek mithilfe der Bibliothek ist, wird a sein viel Härter als Sie erwarten.

Können Sie uns mehr über das Problem erzählen, das Sie lösen möchten? Wir können Sie dann auf einen geeigneten Server verweisen und Ihnen an der richtigen Stelle helfen, anzuschließen.

Überprüfen Sie das:

Dies ist eine Bibliothek auf niedrigerer Ebene. Es ist im Inkubationsstatus und es scheint, dass niemand es drängt. Aber es ist eine großartige API und ich hoffe, sie wird Fortschritte machen.

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

Ich denke, Sie haben sich bereits die richtige Lösung angesehen: Offenes Feuer

Es ist keine kommerzielle Lösung. Es ist ein XMPP -Server über Mina und Steg Geschrieben in Java, veröffentlicht unter der Apache -Lizenz. Kommt ziemlich nahe an das, was Sie gefragt haben. Während ich weiß, dass Sie nach einer Bibliothek gefragt haben, warum nicht eine stabile Open -Source -Software verwenden, die leicht wie OpenFire erweitert werden kann?

Ich fand einen guten XMPP -Server basierend auf Java: http://www.tigase.org/

Sich ansehen Vorpal. Es ist ein Java ee 6-Framework, das das XEP-0114-Protokoll implementiert.

Ich weiß, dass die Absicht darin besteht, einen kleinen Hack im OP zu bauen. Wenn es jedoch jemals Interesse daran gibt, es zu skalieren, End-to-End-Sicherheit usw. Sie sind unser Partner. Wir verwenden Smack in unserer harten Umgebung für virtuelle Maschine in Echtzeit, Jamaicavm, um mit Soapbox zu kommunizieren.

Wenn die Absicht ist, mit einer Server -App zu kommunizieren und einen XMPP -Server (z. B. SOAPBox) nicht neu zu implementieren, kann der Smack -Client dafür verwendet werden. Es ist ein Client des XMPP -Servers, aber die Instanz der tatsächlichen Kommunikation kann über den XMPP -Server vom Client zu Client sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top