2012-03-06 15 views
10

¿Hay alguna manera de abrir un websocket en una página y luego reutilizarlo en otra página (dentro de la misma pestaña, después de que un usuario haga clic en un enlace, por ejemplo) en lugar de tener que abrir un nuevo websocket después de cargar cada página? ¿El almacenamiento del navegador puede mantenerse en un socket abierto?Reutilizando websockets entre páginas?

El objetivo es poder mantener un websocket por usuario (o pestaña) y sería genial hacerlo sin necesidad de moverse entre páginas de una manera no tradicional, por ejemplo cargando contenido en un div usando Javascrpt cada vez que el usuario interactúa con la página.

+1

Cuando se crea una conexión de websocket, existe un estado que ambos lados de la conexión deben seguir para que exista la conexión. Creo que si almacenaste el estado del lado del cliente de una conexión en el almacenamiento local (ten en cuenta que el lado del cliente del sistema websocket debe modificarse para permitir que la mayoría o incluso todos los clientes de websocket no lo admitan hasta donde yo sé), es posible que pueda volver a abrir la conexión más tarde o incluso en otra página (siempre que el servidor no haya perdido su mitad del estado). Entonces debe ser posible pero ¿cómo? Me gustaría ver una muestra de trabajo. –

+0

Imagino que para "volver a crear" el websocket de esa manera el servidor también debería soportarlo. O más particularmente, la biblioteca utilizada para implementar el soporte de websocket en el servidor. Sospecho que la mayoría de las implementaciones en el servidor cerrarían la conexión web cuando detectara que la conexión TCP subyacente estaba cerrada, aunque los cambios en el cliente que sugiera podrían mantenerla abierta. –

+3

Sí, ** una conexión websocket no vive la conexión tcp creada como transporte **, bueno, pensé que eran más inteligentes. –

Respuesta

7

La respuesta es no.

Incluso si el socket no se cierra explícitamente llamando al mySocket.close();, el navegador se cerrará al volver a cargar.

Intenté almacenar el objeto Web Socket en el almacenamiento local y usarlo para recuperar datos nuevamente. El objeto devuelto es válido, pero la conexión ya no existe. Porque, cuando la página se recarga, el socket se termina sin gracia.

Mensaje del lado del servidor dice:

[Errno 10053] An established connection was aborted by the software in your host machine 

Hay que ir ...

+0

Tenía curiosidad por saber qué pasaría si colocas un websocket (o referencia) en el almacenamiento local. Gracias por probarlo y resolver el misterio. –

2

Los Trabajadores web compartidos le permiten compartir una conexión WebSocket para varias pestañas que se cargan desde el mismo origen/sitio.

Los trabajadores web compartidos solo son compatibles actualmente con Chrome, Safari, Opera.

+0

Lo siento, mi pregunta no era lo suficientemente clara. Cuando dije diferentes páginas, debería haber especificado dentro de la misma pestaña. He editado mi pregunta para hacerla más clara. Gracias por tener una oportunidad, sin embargo. –

+0

@Joshua: ah, entonces estás preguntando lo mismo que hace un rato: http://stackoverflow.com/questions/9336774/do-shared-web-workers-persist-across-a-single-page -reload-link-navigation/9337749 No hay una respuesta definitiva a eso tampoco, tengo la intención de probar en algún momento para ver si funciona en Chrome/Safari. – kanaka

+0

Sí, las preguntas son similares, aparte de que esperaba que tal vez hubiera algo diferente acerca de los websockets, lo que significaba que podría obtener una respuesta diferente. –

7

Un enfoque diferente sería la de mantener al usuario en lugar de la toma de corriente a través de diferentes páginas. Con eso me refiero a que usted almacena la identificación del cliente en una cookie con javascript, cada vez que el usuario intenta abrir un nuevo socket desde cualquiera de sus páginas web, envía esta identificación al servidor y luego el servidor tiene una forma de saber que esto nueva conexión es del mismo usuario.

Lo he hecho en un proyecto reciente y funciona perfectamente :) Dependiendo de lo que planeas hacer, puedes mantener el estado del usuario en tu servidor con su ID, o almacenarlo en otra cookie , o el uso del evento flash para almacenarlo en un objeto compartido!

+0

Sí, eso es totalmente posible, y habría sido una solución perfectamente válida (y una de las que discutimos), pero la arquitectura subyacente dependía de que el websocket permaneciera abierto para cumplir con algunos de los requisitos funcionales. Por supuesto, los problemas que podrían haber sido causados ​​por la apertura y cierre de sockets podrían haberse mitigado, pero en última instancia se decidió mantener el socket abierto y cargar dinámicamente el contenido en función de la propiedad de ubicación de la URL. No estoy seguro de que sea la mejor manera, pero c'est la vie. –

+0

@WiMantis ¿qué administrador de conexión para websocket está usando en el servidor? –