Domanda

Speravo di implementare un semplice server XMPP in Java.

Ciò di cui ho bisogno è una libreria in grado di analizzare e comprendere le richieste xmpp da un client. Ho visto Smack (menzionato di seguito) e JSO. Smack sembra essere solo client, quindi mentre potrebbe aiutare ad analizzare i pacchetti, non sa come rispondere ai client. JSO è mantenuto sembra molto vecchio. L'unica strada promettente è quella di separare Openfire che è un intero server XMPP commerciale (OSS).

Speravo solo poche righe di codice in cima a Netty o Mina, quindi ho potuto iniziare a elaborare alcuni messaggi via cavo.


Joe -

Beh, la risposta a quello che sto cercando di fare è un po 'lunga: proverò a farla breve.

Ci sono due cose, che sono solo vagamente correlate:

1) Volevo scrivere un server XMPP perché immagino di scrivere un protocollo personalizzato per la comunicazione tra due client. Fondamentalmente sto pensando a un'app per iPhone in rete, ma non volevo fare affidamento su protocolli binari di basso livello perché l'uso di qualcosa come XMPP significa che l'app può "crescere". molto rapidamente da un'app basata su Wi-Fi locale a una basata su Internet ...

I msg scambiati dovrebbero avere una latenza relativamente bassa, quindi in senso stretto sarebbe meglio un protocollo binario, ma ho sentito che varrebbe la pena esplorare se XMPP non avesse introdotto un sovraccarico eccessivo tale da poterlo usare e quindi trarne dei benefici della sua estensibilità e flessibilità in seguito.

2) Lavoro per Terracotta - quindi ho questa folle tendenza a raggruppare tutto. Non appena ho iniziato a pensare di scrivere un codice server personalizzato, ho pensato di voler raggrupparlo. Terracotta rende banale il ridimensionamento dei POJO Java, quindi il mio pensiero era quello di costruire un server XMPP super semplice come app dimostrativa per Terracotta. Fondamentalmente ogni utente si connetteva al server tramite una connessione TCP, che registra l'utente in una hashmap. Ogni utente avrebbe un LinkedBlockingQueue con un thread di ascolto che prende il messaggio dalla coda. Quindi qualsiasi utente connesso che desidera inviare un messaggio a qualsiasi altro utente (ad es. Qualsiasi vecchia applicazione di chat) invia semplicemente un messaggio XMPP (come al solito) a quell'utente tramite la connessione. Il server lo raccoglie, cerca l'oggetto utente corrispondente in una mappa e posiziona il messaggio sulla coda. Poiché la coda è raggruppata, indipendentemente dal fatto che l'utente di destinazione sia connesso allo stesso server fisico o a un altro server fisico, il messaggio viene recapitato e il thread in ascolto lo raccoglie e lo rimanda indietro sulla connessione tcp dell'utente di destinazione.

Quindi, non troppo breve di un riassunto, temo. Ma è quello che voglio fare. Suppongo che potrei semplicemente scrivere un plugin per Openfire per realizzare il n. 1, ma penso che si occupi di un sacco di impianti idraulici, quindi è più difficile fare il n. 2 (soprattutto perché speravo in una quantità molto piccola di codice che potesse adattarsi a un semplice progetto Maven da 10-20kb).

Altri suggerimenti

Ho passato la stessa ricerca. Prima ho provato Smack e poi mi sono reso conto che è destinato a c2s (da client a server) e non avevo quello di cui avevo bisogno. Ho guardato Tinder ma non mi è piaciuto il modello di licenza (anche quando lo guardavo era molto più grezzo). Alla fine ho guardato Whack e ho capito che era quello di cui avevo bisogno, ma mi manca molto (ecco perché penso che Tinder sia nato).

Quindi ... la mia soluzione? Forked Whack, ha aggiunto un po 'di codice per sottrarre le cose e cerca di semplificarne l'uso: http://github.com / Communitivity / Adirondack

Ho scritto una libreria Scala basata su quella per aiutare a creare agenti basati su componenti esterni, vedi http://github.com/Communitivity/Shellack e http://github.com/Communitivity/MinimalScalaXMPPComponent

Uno dei miei obiettivi principali era quello di semplificare la scrittura rapida di un componente. Un esempio di tale componente è di seguito:

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 condivide la sua API Tinder che è un blocco base estratto da OpenFire solo per la creazione di componenti lato server e possibilmente altri server. Implementa i blocchi di base di XMPP e sei libero di iniziare da lì.

Anche da Ignite Realtime è la Whack API che è specificamente per la costruzione Componenti XMPP

  

Whack è un XMPP (Jabber) Open Source   libreria di componenti per componenti XMPP.   Una libreria Java pura, può essere   incorporato nelle tue applicazioni a   creare qualsiasi cosa da un XMPP completo   componente per semplici integrazioni XMPP   come l'invio di intercettazione e   agire su determinati messaggi.

La soluzione migliore è utilizzare un server esistente e aggiungere la tua funzionalità ad esso. Scrivere un intero server da zero, anche usando una libreria, sarà molto più difficile di quanto ti aspetti.

Puoi dirci di più sul problema che stai cercando di risolvere? Possiamo quindi indirizzarti verso un server appropriato e aiutarti con il posto giusto per collegarti.

controlla questo:

questa è una libreria di livello inferiore. è nello stato di incubazione e sembra che nessuno lo stia spingendo. ma è una grande api e spero che progredisca.

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

Penso che tu abbia già guardato la soluzione giusta: Openfire

Non è una soluzione commerciale. È un server XMPP sopra Mina e Jetty scritto in Java rilasciato sotto licenza Apache. Si avvicina molto a quello che hai chiesto. Mentre so che hai richiesto una libreria, perché non utilizzare un software open source sviluppato stabile che può essere facilmente esteso come openfire?

Ho trovato un buon server xmpp basato su Java: http://www.tigase.org/

Dai un'occhiata a Vorpal . È un framework Java EE 6 che implementa il protocollo XEP-0114.

So che l'intento è costruire un piccolo hack nell'OP. Tuttavia, se c'è mai un interesse nel ridimensionarlo, sicurezza end-to-end, ecc. Suggerirei di guardare Soapbox di Coversant. Sono i nostri partner. Usiamo SMACK nel nostro ambiente di macchine virtuali in tempo reale, JamaicaVM per comunicare con Soapbox.

Inoltre, se si intende comunicare con un'app server e non reimplementare un server XMPP (ad esempio Soapbox), il client SMACK può essere utilizzato per questo. È un client per il server XMPP, ma può essere l'istanza delle comunicazioni effettive da client a client tramite il server XMPP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top