Cómo integrar SockJS con otro framework web

Como alternativa a Socket.io, existe SockJS (https://github.com/sockjs/sockjs-client), que parece estar mejor mantenido y más estable que Socket.io.

Esta pregunta trata sobre la comprensión conceptual de la arquitectura del uso de SockJS con un marco web, por ejemplo, para crear una aplicación de chat.

Mi entendimiento actual es que necesita el cliente SockJS y un servidor SocketJS (en mi caso, tengo la intención de usar SockJS-Tornado (https://github.com/MrJoes/sockjs-tornado)) para poder hacer una comunicación estilo websockets.

Pero, ¿cómo se une SockJS (SockJS-client + SockJS-Tornado) con un marco web que hace el resto del trabajo (por ejemplo, servir la página, escribir/leer en/desde db, etc.)? Por ejemplo, ¿cómo se comunicaría el componente SockJS-Tornado con el servidor web del marco? En particular, cualquier dirección para hacer esto con web2py (un marco web de Python) es muy apreciada.

preguntado el 03 de mayo de 12 a las 18:05

Puede usar una cola de mensajes como RabbitMQ o ZeroMQ. -

@igorw, ¿está diciendo que puedo usar una cola de mensajes para conectar el servidor SockJS-Tornado al servidor web del marco, de modo que las cosas recibidas por SockJS-Tornado se puedan compartir con el marco? ¿Podría por favor elaborar? Gracias. -

Por cierto, también hay autobahn.ws -

3 Respuestas

Tiene razón, para SockJS necesita un servidor compatible con sockjs y una biblioteca de cliente javascript en el navegador.

En general, hay dos patrones de integración, digamos que desea usar sockjs-tornado:

  1. Puede tener todo su sitio servido desde Tornado. Con eso, conecte sockjs-tornado a alguna ruta, por ejemplo, 'http://mysite.com/sockjs'. En este escenario, tanto su sitio web como sockjs se atenderán desde el dominio mysite.com.
  2. Puede mantener su sitio en cualquier idioma/marco en el que esté escrito y agregar sockjs-servers como otro componente, bajo un dominio diferente, como. 'http://sockjs.mysite.com/sockjs'.

Además, puede usar cualquier variación de esto, por ejemplo: tener dos servidores internamente pero exponerlos como un dominio mediante el uso de un equilibrador de carga inteligente (como haproxy).

contestado el 08 de mayo de 12 a las 11:05

gracias por las sugerencias Me gustaría saber más sobre las segundas opciones que me has propuesto. En particular, cómo interconectar SockJS-Tornado con el servidor web que utiliza el marco. Por ejemplo, ¿cuál es el flujo de trabajo de una solicitud del navegador al lado del servidor (consta de un SockJS-Tornado y un servidor web del marco) y viceversa? Gracias. - MLister

Mantenga dos servidores separados. Uno: tu antigua aplicación. Nuevo - sockjs-tornado. Use HAProxy para el enrutamiento si desea exponerlo como un solo dominio, o simplemente use dos dominios separados. Si necesita comunicación entre sockjs y su aplicación, use Redis Pub/sub, RabbitMQ o zeromq para intercambiar mensajes entre los dos. - Marek

hola @Marek. ¿Cómo intercambio mensajes entre la aplicación y sockjs donde solo debería tener 2 servidores separados? mi configuración actual es que tengo que ejecutar una tercera ... la secuencia de comandos del servidor zmq donde están vinculados 4 sockets. receptor_desde_servidor.bind("tcp://*:5561") # zmq.PULL reenviador_a_servidor.bind("tcp://*:5562") # zmq.PUSH receptor_desde_websocket.bind("tcp://*:5563") # zmq.PULL reenviador_a_websocket.bind("tcp://*:5564") # zmq.PUSH - bombon.langes

Si está utilizando web2py como marco, puede buscar un comet_messaging.py en gluon/contrib. Proporciona una función (comet_send) para enviar mensajes de la aplicación web2py a sus clientes websocket. Se basa en tornado (sin compatibilidad con SockJS), pero DistributeHandler puede subclasificar una conexión SockJS para proporcionar compatibilidad con el transporte alternativo. En este enfoque, sus clientes envían mensajes a través de solicitudes típicas GET o POST HTTP que son manejadas por controladores web2py (u otro marco) y reciben mensajes de los controladores web2py llamando a comet_messaging.comet_send() que envía una solicitud posterior a la instancia de tornado que luego explota a su lista de oyentes.

Las líneas modificadas en comet_messaging parecen (Notice open se convierte en on_open):

class DistributeHandler(sockjs.tornado.SockJSConnection):
    def on_open(self, r):
    group,token,name = [None, None, None]
    self.group = group or 'default'
    self.token = token or 'none'
    self.name = name or 'anonymous'   

y

urls=[
    (r'/', PostHandler),
    (r'/token', TokenHandler),
    (r'/realtime', DistributeHandler)]

Tenga en cuenta que tuve que eliminar el grupo de expresiones regulares en DistributeHandler URLSpec porque sockJS-tornado se estaba ahogando. Todavía estoy tratando de averiguar cómo obtener parámetros de la ruta al controlador on_open.

contestado el 29 de mayo de 12 a las 01:05

Esto proporciona una respuesta completa sobre cómo integrar SockJS en Django: https://stackoverflow.com/a/10950702/675065

Básicamente necesitas:

  • Tornado + CalcetínJS-Tornado
  • Redis + Brukva

Yo uso esta configuración en mi propio proyecto y funciona bastante bien.

O: prueba el camino de la autopista: http://autobahn.ws/ (Aún no lo probé)

contestado el 23 de mayo de 17 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.