Pregunta

Esperaba implementar un servidor XMPP simple en Java.

Lo que necesito es una biblioteca que pueda analizar y comprender las solicitudes xmpp de un cliente. He mirado a Smack (mencionado abajo) y JSO. Smack parece ser solo cliente, por lo que, si bien puede ayudar a analizar paquetes, no sabe cómo responder a los clientes. Se mantiene JSO se ve muy viejo. La única vía prometedora es separar Openfire, que es un servidor XMPP comercial completo (OSS).

Estaba esperando unas pocas líneas de código en la parte superior de Netty o Mina, por lo que podría comenzar a procesar algunos mensajes por cable.


Joe -

Bueno, la respuesta a lo que estoy tratando de hacer es algo larga, intentaré que sea breve.

Hay dos cosas, que solo están ligeramente relacionadas:

1) Quería escribir un servidor XMPP porque me imagino escribiendo un protocolo personalizado para que dos clientes se comuniquen. Básicamente, estoy pensando en una aplicación de iPhone en red, pero no quería confiar en los protocolos binarios de bajo nivel porque usar algo como XMPP significa que la aplicación puede "crecer" muy rápidamente desde una aplicación local basada en wifi a una basada en internet ...

Los mensajes intercambiados deben tener una latencia relativamente baja, por lo que, estrictamente, sería mejor utilizar un protocolo binario, pero sentí que valdría la pena explorar si XMPP no presentaba demasiados gastos generales, por lo que podría usarlo y luego obtener beneficios. de su capacidad de extensión y flexibilidad más adelante.

2) Trabajo para Terracota, así que tengo esta loca inclinación a agrupar todo. Tan pronto como comencé a pensar en escribir algún código de servidor personalizado, pensé que quería agruparlo. Terracota hace que la ampliación de Java POJOs sea trivial, por lo que pensé en construir un servidor XMPP súper simple como una aplicación de demostración para Terracota. Básicamente, cada usuario se conectaría al servidor a través de una conexión TCP, lo que registraría al usuario en un hashmap. Cada usuario tendría un LinkedBlockingQueue con un hilo de escucha que tomaba un mensaje de la cola. Luego, cualquier usuario conectado que desee enviar un mensaje a cualquier otro usuario (por ejemplo, cualquier aplicación de chat antigua) simplemente emite un mensaje XMPP (como es habitual) a ese usuario a través de la conexión. El servidor lo recoge, busca el objeto de usuario correspondiente en un mapa y coloca el mensaje en la cola. Dado que la cola está agrupada, independientemente de si el usuario de destino está conectado al mismo servidor físico, o a un servidor físico diferente, el mensaje se entrega y el hilo que está escuchando lo recoge y lo envía de vuelta a través de la conexión tcp del usuario de destino.

Entonces, me temo que no me falta un resumen. Pero eso es lo que quiero hacer. Supongo que podría escribir un complemento para Openfire para lograr el número 1, pero creo que se encarga de una gran cantidad de tuberías, por lo que es más difícil hacer el número 2 (especialmente porque esperaba una cantidad muy pequeña de código que pudiera encajar en un proyecto simple de 10-20kb Maven).

Otros consejos

Pasé por la misma búsqueda. Primero probé Smack y luego me di cuenta de que estaba dirigido a c2s (cliente a servidor) y no tenía lo que necesitaba. Miré a Tinder pero no me gustó el modelo de licencia (también cuando lo miré era mucho más crudo). Finalmente miré a Whack y me di cuenta de que era lo que necesitaba, pero me falta mucho (creo que por eso surgió Tinder).

Entonces ... ¿mi solución? Forked Whack, agregó algo de código para abstraer cosas y trata de que sea más fácil de usar: http://github.com / Comunitividad / Adirondack

Escribí una biblioteca de Scala basada en eso para ayudar a crear agentes externos basados ??en componentes, vea http://github.com/Communitivity/Shellack y http://github.com/Communitivity/MinimalScalaXMPPComponent

Uno de mis objetivos principales era facilitar la escritura rápida de un componente. A continuación se muestra un ejemplo de dicho componente:

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 comparte su API de Tinder , que es un componente básico extraído de OpenFire. Para la creación de componentes del lado del servidor y posiblemente otros servidores. Implementa bloques de construcción básicos de XMPP y puedes comenzar desde allí.

También de Ignite Realtime es la Whack API que es específicamente para la construcción Componentes XMPP

  

Whack es un XMPP de código abierto (Jabber)   biblioteca de componentes para componentes XMPP.   Una biblioteca pura de Java, puede ser   incrustado en sus aplicaciones para   crear cualquier cosa desde un XMPP completo   Componente para integraciones XMPP simples   tales como el envío de interceptación y   actuando sobre ciertos mensajes.

Su mejor apuesta es usar un servidor existente y agregarle su funcionalidad. Escribir un servidor completo desde cero, incluso utilizando una biblioteca, va a ser un lote más difícil de lo que usted espera.

¿Puede decirnos más sobre el problema que está tratando de resolver? Luego podemos indicarle un servidor apropiado y ayudarlo con el lugar correcto para conectarse.

mira esto:

esta es una biblioteca de nivel inferior. está en estado de incubación y parece que nadie lo está presionando. pero es una gran api y espero que progrese.

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

Creo que ya has visto la solución correcta: Openfire

No es una solución comercial. Es un servidor XMPP encima de Mina y Jetty escrito en Java y publicado bajo la licencia Apache. Se acerca bastante a lo que pediste. Si bien sé que usted solicitó una biblioteca, ¿por qué no usa un software de código abierto de desarrollo estable que se pueda ampliar fácilmente como Openfire?

Encontré un buen servidor xmpp basado en Java: http://www.tigase.org/

Echa un vistazo a Vorpal . Es un framework Java EE 6 que implementa el protocolo XEP-0114.

Sé que la intención es construir un pequeño hack en el OP. Sin embargo, si alguna vez hay un interés en escalarlo, la seguridad de extremo a extremo, Yo sugeriría mirar Soapbox de Coversant. Ellos son nuestro socio. Usamos SMACK en nuestro duro entorno de máquina virtual en tiempo real, JamaicaVM para comunicarnos con Soapbox.

Además, si la intención es comunicarse con una aplicación de servidor y no volver a implementar un servidor XMPP (por ejemplo, Soapbox), el cliente SMACK puede usarse para eso. Es un cliente para el servidor XMPP, pero la instancia de las comunicaciones reales puede ser de cliente a cliente a través del servidor XMPP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top