2012-06-07 19 views
121

Estoy investigando nodejs/socket.io para chat en tiempo real, y necesito algunos consejos para implementar salas.socket.io habitaciones o espacios de nombres?

¿Qué es mejor, usar el espacio de nombres o usar la función de sala para aislar por completo los grupos de conversaciones?

¿Cuál es la verdadera diferencia técnica entre las salas y el espacio de nombres?

¿Existe alguna diferencia en el uso de los recursos?

Respuesta

165

Esto es lo que los espacios de nombres y las habitaciones tienen en común (socket.io v0.9.8 - Tenga en cuenta que v1.0 involucrada una reescritura completa, así que las cosas podrían haber cambiado):

  • Tanto espacios de nombres (io.of('/nsp')) y habitaciones (socket.join('room')) se crean en el lado del servidor
  • comparten la misma conexión
  • múltiples espacios de nombres y varias habitaciones (WebSocket)
  • El servidor transmitirá mensajes por cable solo a los clientes que se conectaron a/se unieron a una nsp/sala, es decirno se trata sólo del lado del cliente filtrado

Los diferencias:

  • espacios de nombres están conectados con el cliente usando io.connect(urlAndNsp) (se añadirán al cliente a ese espacio de nombres sólo si ya existe en

      el servidor)
    • las habitaciones se pueden unir solo en el lado del servidor (aunque crear una API en el lado del servidor para permitir que los clientes se unan es sencillo)
    • espacios de nombres pueden ser authorization protected
    • autorización no está disponible con habitaciones, pero la autorización personalizada podrían añadirse a lo anterior, fáciles de crear API en el servidor, en caso de que uno está doblado sobre el uso de salas de
    • habitaciones son parte de un espacio de nombres (morosos al espacio de nombres 'global')
    • espacios de nombres siempre tienen su origen en el ámbito global

    Para no confundir el concepto con el nombre (sala o espacio de nombres), utilizaré compartimiento para referirse al concepto, y los otros dos nombres para las implementaciones del concepto. Así que si

    • necesidad por compartimentos autorización, espacios de nombres puede ser la ruta más fácil para tomar
    • si quieres compartimentos jerárquicamente en capas (2 capas max), utilice una combinación de espacio de nombres/sala de
    • si su aplicación del lado del cliente consta de diferentes partes que (no les interesan los compartimentos sino) deben separarse, use espacios de nombres.

    Un ejemplo para esta última sería una gran aplicación cliente donde diferentes módulos, tal vez desarrollados por separado (por ejemplo, de terceros), cada uno utilizando socket.io de forma independiente, se utilizan en la misma aplicación y desea compartir un conexión de red única.

    Al no haber comparado realmente esto, me parece que si solo necesita compartimentos simples en su proyecto para separar y agrupar mensajes, cualquiera de ellos está bien.

    No estoy seguro de si eso responde a su pregunta, pero la investigación que condujo a esta respuesta al menos me ayudó a ver más claro.

  • +3

    ¿Hay algo importante que haya cambiado en esto después de la versión de socket.io> = 1.0? – Xeroxoid

    +1

    Cambios en la última versión, lea http://socket.io/docs/rooms-and-namespaces/ y esta respuesta puede ser útil para entender cosas de las habitaciones http://stackoverflow.com/questions/24041220/sending-message -to-a-specific-id-in-socket-io-1-0/24224146 # 24224146 –

    +1

    ¿Podemos decir que el espacio de nombre es un área determinada de mi aplicación web y alojar a un grupo de clientes en esa área? – Onaiggac

    9

    Depende de lo que quieras hacer.

    La principal diferencia es que las habitaciones son más difíciles de implementar. Debe crear un método para unir las salas con cada recarga de página.

    Con espacios de nombres sólo tiene que escribir en su var example = io.connect('http://localhost/example');Javascript cliente y el cliente se añade automáticamente en los espacios de nombres.

    Ejemplo de utilización:

    • habitaciones: chat privado.
    • espacios de nombres: el chat de la página.
    43

    Es una vieja pregunta, pero después de hacer algunas investigaciones sobre el tema, encuentro que la respuesta aceptada no es clara en un punto importante. Según el propio Guillermo Rauch (see link): aunque teóricamente es posible crear espacios de nombres dinámicamente en una aplicación en ejecución, los usa principalmente como secciones separadas predefinidas de su aplicación. Si, por otro lado, necesita crear compartimentos ad hoc, sobre la marcha, para acomodar grupos de usuarios/conexiones, lo mejor es usar habitaciones.