stringtranslate.com

Cometa (programación)

Comet es un modelo de aplicación web en el que una solicitud HTTPS de larga duración permite a un servidor web enviar datos a un navegador , sin que el navegador los solicite explícitamente. [1] [2] Comet es un término general que abarca múltiples técnicas para lograr esta interacción. Todos estos métodos se basan en funciones incluidas de forma predeterminada en los navegadores, como JavaScript , en lugar de en complementos no predeterminados. El enfoque de Comet difiere del modelo original de la web , en el que un navegador solicita una página web completa a la vez. [3]

El uso de las técnicas Comet en el desarrollo web es anterior al uso de la palabra Comet como neologismo para las técnicas colectivas. Comet es conocido por otros nombres, entre ellos Ajax Push , [4] [5] Reverse Ajax , [6] Two-way-web , [7] HTTP Streaming , [7] y HTTP server push [8], entre otros. [9] El término Comet no es un acrónimo, sino que fue acuñado por Alex Russell en su publicación de blog de 2006. [a] [ cita requerida ]

En los últimos años, la estandarización y el soporte generalizado de WebSocket y eventos enviados por el servidor han dejado obsoleto el modelo Comet.

Historia

Primeros applets de Java

La capacidad de incorporar applets de Java en los navegadores (a partir de Netscape Navigator 2.0 en marzo de 1996 [10] ) hizo posible la comunicación bidireccional sostenida, utilizando un socket TCP sin formato [11] para comunicarse entre el navegador y el servidor. Este socket puede permanecer abierto mientras el navegador esté en el documento que aloja el applet. Las notificaciones de eventos se pueden enviar en cualquier formato (texto o binario) y el applet las puede decodificar.

El primer marco de comunicación de navegador a navegador

La primera aplicación que utilizó comunicaciones de navegador a navegador fue Tango Interactive, [12] [ verificación fallida ] implementada en 1996-98 en el Centro de Arquitecturas Paralelas del Noreste (NPAC) en la Universidad de Syracuse utilizando fondos de DARPA . La arquitectura TANGO ha sido patentada por la Universidad de Syracuse. [13] El marco TANGO se ha utilizado ampliamente como una herramienta de educación a distancia. [14] El marco ha sido comercializado por CollabWorx y se ha utilizado en una docena de aplicaciones de Comando y Control y Entrenamiento en el Departamento de Defensa de los Estados Unidos [ cita requerida ] .

Primeras aplicaciones del Comet

El primer conjunto de implementaciones de Comet se remonta al año 2000, [15] [ ¿fuente poco fiable? ] con los proyectos Pushlets , Lightstreamer y KnowNow. Pushlets , un marco creado por Just van den Broecke, fue una de las primeras [16] implementaciones de código abierto. Pushlets se basaba en servlets Java del lado del servidor y una biblioteca JavaScript del lado del cliente. Bang Networks, una start-up de Silicon Valley respaldada por el cofundador de Netscape , Marc Andreessen  , tuvo un intento financiado generosamente de crear un estándar de push en tiempo real para toda la web. [17]

En abril de 2001, Chip Morningstar comenzó a desarrollar un servidor web basado en Java (J2SE) que utilizaba dos conectores HTTP para mantener abiertos dos canales de comunicación entre el servidor HTTP personalizado que él había diseñado y un cliente diseñado por Douglas Crockford ; en junio de 2001 ya existía un sistema de demostración en funcionamiento. [ cita requerida ] El servidor y el cliente utilizaban un formato de mensajería que los fundadores de State Software, Inc. aceptaron acuñar como JSON siguiendo la sugerencia de Crockford. Todo el sistema, las bibliotecas de cliente, el formato de mensajería conocido como JSON y el servidor se convirtieron en el State Application Framework, partes del cual fueron vendidas y utilizadas por Sun Microsystems, Amazon.com, EDS y Volkswagen. [ cita requerida ]

En marzo de 2006, el ingeniero de software Alex Russell acuñó el término Comet en una publicación en su blog personal. [18] El nuevo término era un juego de palabras con Ajax ( Ajax y Comet son limpiadores domésticos comunes en los EE. UU.). [19] [20] [21]

En 2006, algunas aplicaciones expusieron esas técnicas a un público más amplio: la aplicación de chat basada en web multiprotocolo de Meebo permitió a los usuarios conectarse a las plataformas de chat de AOL , Yahoo y Microsoft a través del navegador; Google agregó chat basado en web a Gmail ; JotSpot , una startup adquirida posteriormente por Google, construyó una edición colaborativa de documentos en tiempo real basada en Comet. [22] Se crearon nuevas variantes de Comet, como el marco JSF ICEfaces basado en Java (aunque prefieren el término " Ajax Push " [5] ). Otros que habían utilizado anteriormente transportes basados ​​en subprogramas Java cambiaron a implementaciones puramente JavaScript. [23]

Implementaciones

Las aplicaciones Comet intentan eliminar las limitaciones del modelo web página por página y del sondeo tradicional ofreciendo una interacción sostenida bidireccional, utilizando una conexión HTTP persistente o duradera entre el servidor y el cliente. Dado que los navegadores y los servidores proxy no están diseñados teniendo en cuenta los eventos del servidor, se han desarrollado varias técnicas para lograrlo, cada una con diferentes beneficios y desventajas. El mayor obstáculo es la especificación HTTP 1.1, que establece que "esta especificación... alienta a los clientes a ser conservadores al abrir múltiples conexiones". [24] Por lo tanto, mantener una conexión abierta para eventos en tiempo real tiene un impacto negativo en la usabilidad del navegador: el navegador puede quedar bloqueado y no puede enviar una nueva solicitud mientras espera los resultados de una solicitud anterior, por ejemplo, una serie de imágenes. Esto se puede solucionar creando un nombre de host distinto para la información en tiempo real, que es un alias para el mismo servidor físico. Esta estrategia es una aplicación de fragmentación de dominios.

Los métodos específicos de implementación de Comet se dividen en dos categorías principales: streaming y sondeo largo .

Transmisión

Una aplicación que utiliza Comet en streaming abre una única conexión persistente desde el navegador del cliente al servidor para todos los eventos de Comet . Estos eventos se gestionan e interpretan de forma incremental en el lado del cliente cada vez que el servidor envía un nuevo evento, sin que ninguno de los dos lados cierre la conexión. [3]

Las técnicas específicas para lograr el streaming de Comet incluyen las siguientes:

iframe oculto

Una técnica básica para aplicaciones web dinámicas es utilizar un elemento HTML iframe oculto (un marco en línea , que permite a un sitio web incrustar un documento HTML dentro de otro). Este iframe invisible se envía como un bloque fragmentado , que implícitamente lo declara como infinitamente largo (a veces llamado "marco para siempre"). A medida que ocurren los eventos, el iframe se llena gradualmente con scriptetiquetas, que contienen JavaScript para ser ejecutado en el navegador. Debido a que los navegadores procesan las páginas HTML de forma incremental, cada scriptetiqueta se ejecuta a medida que se recibe. Algunos navegadores requieren un tamaño de documento mínimo específico antes de que se inicie el análisis y la ejecución, que se puede obtener enviando inicialmente 1–2 kB de espacios de relleno. [25]

Una ventaja del método iframes es que funciona en todos los navegadores comunes. Dos desventajas de esta técnica son la falta de un método confiable de manejo de errores y la imposibilidad de rastrear el estado del proceso de llamada de la solicitud. [25]

Solicitud XMLHttp

El objeto XMLHttpRequest (XHR), una herramienta utilizada por las aplicaciones Ajax para la comunicación entre navegador y servidor, también se puede utilizar para la mensajería Comet entre servidor y navegador generando un formato de datos personalizado para una respuesta XHR y analizando cada evento mediante JavaScript del lado del navegador; confiando únicamente en que el navegador active la onreadystatechangedevolución de llamada cada vez que recibe nuevos datos.

Ajax con sondeos largos

Ninguno de los transportes de streaming anteriores funciona en todos los navegadores modernos sin efectos secundarios negativos. Esto obliga a los desarrolladores de Comet a implementar varios transportes de streaming complejos, alternando entre ellos según el navegador. En consecuencia, muchas aplicaciones Comet utilizan sondeos largos, que son más fáciles de implementar en el lado del navegador y funcionan, como mínimo, en todos los navegadores que admiten XHR. Como sugiere el nombre, el sondeo largo requiere que el cliente sondee al servidor para un evento (o un conjunto de eventos). El navegador realiza una solicitud de estilo Ajax al servidor, que se mantiene abierta hasta que el servidor tenga nuevos datos para enviar al navegador, que se envían al navegador en una respuesta completa. El navegador inicia una nueva solicitud de sondeo largo para obtener eventos posteriores. La RFC 6202 de IETF "Problemas conocidos y mejores prácticas para el uso de sondeo largo y streaming en HTTP bidireccional" compara el sondeo largo y el streaming HTTP. Las tecnologías específicas para lograr el sondeo largo incluyen las siguientes:

Sondeo largo de XMLHttpRequest

En su mayor parte, el sondeo largo de XMLHttpRequest funciona como cualquier uso estándar de XHR. El navegador realiza una solicitud asincrónica al servidor, que puede esperar a que los datos estén disponibles antes de responder. La respuesta puede contener datos codificados (normalmente XML o JSON ) o Javascript para que el cliente los ejecute. Al final del procesamiento de la respuesta, el navegador crea y envía otro XHR, a la espera del próximo evento. De este modo, el navegador siempre mantiene una solicitud pendiente en el servidor, que debe responderse cuando se produce cada evento.

Etiqueta de script de sondeo largo

Si bien cualquier transporte Comet puede funcionar en subdominios , ninguno de los transportes anteriores se puede utilizar en diferentes dominios de segundo nivel (SLD), debido a las políticas de seguridad del navegador diseñadas para evitar ataques de secuencias de comandos entre sitios . [26] Es decir, si la página web principal se sirve desde un SLD y el servidor Comet está ubicado en otro SLD (que no tiene habilitado el uso compartido de recursos de origen cruzado ), los eventos Comet no se pueden usar para modificar el HTML y el DOM de la página principal, utilizando esos transportes. Este problema se puede evitar creando un servidor proxy frente a una o ambas fuentes, lo que hace que parezcan originarse en el mismo dominio. Sin embargo, esto a menudo no es deseable por razones de complejidad o rendimiento.

A diferencia de los iframes o los objetos XMLHttpRequest, scriptlas etiquetas pueden apuntar a cualquier URI y el código JavaScript de la respuesta se ejecutará en el documento HTML actual. Esto crea un riesgo de seguridad potencial para ambos servidores involucrados, aunque el riesgo para el proveedor de datos (en nuestro caso, el servidor Comet) se puede evitar utilizando JSONP .

Se puede crear un transporte Comet de sondeo largo creando scriptelementos dinámicamente y estableciendo su origen en la ubicación del servidor Comet, que luego envía JavaScript (o JSONP) con algún evento como su carga útil. Cada vez que se completa la solicitud de script, el navegador abre uno nuevo, al igual que en el caso del sondeo largo XHR. Este método tiene la ventaja de ser multinavegador y, al mismo tiempo, permite implementaciones multidominio. [26]

Alternativas

Las tecnologías nativas del navegador son inherentes al término Comet. Los intentos de mejorar la comunicación HTTP sin sondeo han surgido de múltiples lados:

Véase también

Notas

  1. ^ Russell, Alex (4 de marzo de 2006). "Comet: datos de baja latencia para el navegador" . Consultado el 2 de noviembre de 2014 .

Referencias

  1. ^ Krill, Paul (24 de septiembre de 2007). «AJAX alliance reconoce mashups». InfoWorld . Consultado el 20 de octubre de 2010 .
  2. ^ Crane, Dave; McCarthy, Phil (13 de octubre de 2008). Comet y Reverse Ajax: la próxima generación de Ajax 2.0 . Apress . ISBN 978-1-59059-998-3.
  3. ^ ab Gravelle, Rob. "Programación Comet: uso de Ajax para simular la inserción en el servidor". Webreference.com. Archivado desde el original el 18 de octubre de 2010. Consultado el 20 de octubre de 2010 .
  4. ^ Egloff, Andreas (5 de mayo de 2007). Ajax Push (también conocido como Comet) con Java Business Integration (JBI) (discurso). JavaOne 2007, San Francisco, California : Sun Microsystems , Inc. Consultado el 10 de junio de 2008 .{{cite speech}}: Mantenimiento de CS1: ubicación ( enlace )
  5. ^ ab "Ajax Push". ICEfaces.org . Consultado el 23 de octubre de 2014 .
  6. ^ Crane, Dave; McCarthy, Phil (julio de 2008). Comet y Reverse Ajax: la próxima generación de Ajax 2.0 . Apress. ISBN 978-1-59059-998-3.
  7. ^ ab Mahemoff, Michael (junio de 2006). "Web Remoting" . Patrones de diseño Ajax . O'Reilly Media . Págs. 19, 85. ISBN. 0-596-10180-5.
  8. ^ Double, Chris (5 de noviembre de 2005). "Más sobre Ajax y el envío de mensajes push al servidor". Diferentes formas de enviar mensajes push al servidor . Consultado el 5 de mayo de 2008 .
  9. ^ Nesbitt, Bryce (1 de noviembre de 2005). "La técnica de carga lenta/AJAX inverso". Simulación de inserción de servidor en un navegador web estándar . Archivado desde el original el 8 de febrero de 2006. Consultado el 6 de mayo de 2008 .
  10. ^ "Netscape.com". Archivado desde el original el 15 de noviembre de 1996. Consultado el 16 de agosto de 2017 .{{cite web}}: CS1 maint: bot: estado de URL original desconocido ( enlace )
  11. ^ "java.net.Socket (Java 2 Platform SE v1.4.2)" Archivado el 19 de mayo de 2009 en Wayback Machine .
  12. ^ Beca, Lukasz (1997). "TANGO - un entorno colaborativo para la World Wide Web". Universidad de Syracuse SURFACE . Northeast Parallel Architecture Center, Facultad de Ingeniería y Ciencias de la Computación . Consultado el 27 de febrero de 2016 .
  13. ^ Podgorny, Marek; Beca, Lukasz; Cheng, Gang; Fox, Geoffrey C.; Jurga, Tomasz; Olszewski, Konrad; Sokolowski, Piotr; Walczak, Krzysztof; PL (20 de junio de 2000), Patente de los Estados Unidos: 6078948 - Estructura y columna vertebral de colaboración independiente de la plataforma para formar comunidades virtuales que tienen salas virtuales con sesiones colaborativas, archivado desde el original el 2017-05-09 , recuperado el 2016-02-27
  14. ^ Baer, ​​Troy (1999). "Experiencias con el uso de TANGO Interactive en un taller distribuido" (PDF) . Centro de recursos compartidos principal de CEWES . CEWES MSRC/PET TR/99-21. Archivado desde el original (PDF) el 8 de marzo de 2021. Consultado el 27 de febrero de 2016 .
  15. ^ "CometDaily: Comet and Push Technology". Archivado desde el original el 13 de noviembre de 2007. Consultado el 15 de diciembre de 2007 .
  16. ^ Just van den Broecke (1 de marzo de 2000). “Pushlets: Send events from servlets to DHTML client browsers” (Archivado el 4 de agosto de 2014 en Wayback Machine ). JavaWorld. Consultado el 1 de agosto de 2014.
  17. ^ Borland, John (1 de abril de 2001). "¿Se volverá obsoleto el botón "actualizar"?". CNET Networks . Consultado el 22 de julio de 2008 .
  18. ^ Alex Russell (3 de marzo de 2006). “Comet: Low Latency Data for the Browser Archivado el 12 de agosto de 2008 en Wayback Machine ”. Blog de Alex Russell. Consultado el 29 de noviembre de 2007.
  19. ^ K. Taft, Darryl (12 de mayo de 2006). "Microsoft elimina Comet del conjunto de herramientas AJAX". eWEEK.com . Consultado el 21 de julio de 2008 .
  20. ^ Orbited: Habilitando el cometa para las masas: OSCON 2008 - Conferencias O'Reilly, 21 al 25 de julio de 2008, Portland, Oregón
  21. ^ Presentación en vivo de Enterprise Comet y Web 2.0 Archivado el 20 de mayo de 2008 en Wayback Machine
  22. ^ Dion Almaer (29 de septiembre de 2005). “Jotspot Live: Live, group note-taking” (entrevista con Abe Fettig). Ajaxian. Consultado el 15 de diciembre de 2007.
    Matt Marshall (15 de diciembre de 2006). “Renkoo lanza un servicio de eventos, a tiempo para programar cócteles navideños”. Venture Beat. Consultado el 15 de diciembre de 2007.
  23. ^ Clint Boulton (27 de diciembre de 2005). “Startups Board the AJAX Bandwagon”. DevX News. Consultado el 18 de febrero de 2008.
  24. ^ Protocolo de transferencia de hipertexto (HTTP/1.1): sintaxis de mensajes y enrutamiento, sección 6.4. IETF. Consultado el 29 de julio de 2014.
  25. ^ ab Holdener III, Anthony T. (enero de 2008). "Diseño de página con marcos que no lo son". Ajax: la guía definitiva . O'Reilly Media . pág. 320. ISBN 978-0-596-52838-6.
  26. ^ ab Flanagan, David (17 de agosto de 2006). "13.8.4 Cross-Site Scripting". JavaScript: la guía definitiva . O'Reilly Media . pág. 994. ISBN. 0-596-10199-6.
  27. ^ Ian Hickson, ed. (2007-10-27). "6.2 Eventos DOM enviados por el servidor". HTML 5 - Llamado a comentarios . WHATWG . Consultado el 2008-10-07 .
  28. ^ Hickson, Ian (23 de abril de 2009). "La API de WebSocket". W3C . Consultado el 21 de julio de 2009 .
  29. ^ Alex Russell; et al. (2007). "Protocolo Bayeux - Bayeux 1.0draft1". Fundación Dojo . Consultado el 14 de diciembre de 2007 .
  30. ^ Crockford, Douglas (17 de abril de 2006). "JSONRequest Duplex". Una alternativa a XMLHttpRequest para la transferencia de datos iniciada por el servidor de larga duración . Consultado el 5 de mayo de 2008 .
  31. ^ App, The. (2010-12-02) Blog de Google App Engine: Felices fiestas de parte del equipo de App Engine: lanzamiento del SDK 1.4.0. Googleappengine.blogspot.com. Consultado el 12 de abril de 2014.
  32. ^ Paul, Ryan. (2010-12-06) App Engine incorpora Streaming API y tareas en segundo plano más largas. Ars Technica. Recuperado el 12 de abril de 2014.
  33. ^ "Paquete com.google.appengine.api.channel". 16 de noviembre de 2019. Consultado el 30 de abril de 2020. Esta API ha quedado obsoleta.

Enlaces externos