2012-05-03 24 views
7

Como alternativa a Socket.io, existe SockJS (https://github.com/sockjs/sockjs-client), que parece ser mejor mantenido y más estable que Socket.io.Cómo integrar SockJS con otro marco web

Esta pregunta es acerca de la comprensión conceptual de la arquitectura de la utilización de SockJS con un framework de desarrollo web, por ejemplo, para la construcción de una aplicación de chat

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

Pero, ¿cómo SockJS (SockJS-cliente + SockJS-Tornado) atan junto con un marco web que hace el resto del trabajo (por ejemplo, al servicio de la página, la escritura/lectura a/desde db, etc). Por ejemplo, ¿cómo se comunicaría el componente SockJS-Tornado con el servidor web del framework? En particular, cualquier dirección de hacer esto con web2py (un framework web de python) es muy apreciada.

+0

Se puede utilizar una cola de mensajes tales como RabbitMQ o ZeroMQ. – igorw

+0

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

+0

Por cierto, también hay http://autobahn.ws/ – Alp

Respuesta

4

Tienes razón, para SockJS necesitas un servidor habilitado para sockjs y una biblioteca de cliente javascript en el navegador.

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

  1. Es posible que tenga toda su sitio sirve de Tornado. Con eso, engancha sockjs-tornado a algún camino, por ejemplo 'http://mysite.com/sockjs'. En este escenario, tanto su sitio web como sockjs se servirán desde el dominio de mysite.com.
  2. Puede mantener su sitio en el idioma/marco en el que está escrito y agregar sockjs-serveras a 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 usando un loadblancer inteligente (como haproxy).

+1

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

+2

Mantenga dos servidores separados. Uno: tu aplicación anterior Nuevo - sockjs-tornado. Use HAProxy para el enrutamiento si desea exponerlo como un único 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

+0

hi @Marek. ¿Cómo intercambio mensajes entre la aplicación y el sockjs donde solo debería tener 2 servidores separados? mi configuración actual es que tengo que ejecutar un tercero ... el script del servidor zmq donde están vinculados 4 sockets. receiver_from_server.bind ("tcp: // *: 5561") # zmq.PULL forwarder_to_server.bind ("tcp: // *: 5562") # zmq.PUSH receiver_from_websocket.bind ("tcp: // * : 5563 ") # zmq.PULL forwarder_to_websocket.bind (" tcp: // *: 5564 ") # zmq.PUSH –

1

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

Las líneas modificadas en comet_messaging se parezca a (Aviso abierta 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)] 

Aviso tuve que quitar el grupo de expresiones regulares en el DistributeHandler URLSpec porque sockJS-tornado era ahogándose en eso. Todavía estoy tratando de descubrir cómo obtener los parámetros de la ruta al controlador on_open.

0

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

Básicamente lo que necesita:

  • Tornado + SockJS-Tornado
  • Redis + Brukva

I usar esta configuración en mi propio proyecto y funciona bastante bien.

O: Intenta la forma en autopista: http://autobahn.ws/ (no probé descubierto todavía)

Cuestiones relacionadas