2012-03-06 7 views
10

Czy istnieje sposób na otwarcie websocket na jednej stronie, a następnie ponowne użycie go na innej stronie (na tej samej karcie, na przykład po kliknięciu przez użytkownika na łączu) zamiast otwierania nowego websocket po każdym załadowaniu strony? Czy pamięć przeglądarki może trzymać się otwartego gniazda?Ponowne wykorzystanie websockets między stronami?

Celem jest utrzymywanie jednego websocket na użytkownika (lub zakładkę) i byłoby świetnie zrobić to bez konieczności przechodzenia między stronami w nietradycyjny sposób, na przykład ładowanie zawartości do elementu div przy użyciu Joincrpt za każdym razem, gdy użytkownik wchodzi w interakcję ze stroną.

+1

Po utworzeniu połączenia z internetem istnieje stan, który obie strony połączenia muszą śledzić, aby połączenie istniało. Wydaje mi się, że jeśli zapisałeś stan po stronie klienta połączenia w pamięci lokalnej (pamiętaj, że strona klienta systemu websocket musi zostać zmodyfikowana, aby umożliwić to większości lub nawet wszystkim klientom sieciowym nie obsługują tego, o ile wiem), możesz być w stanie ponownie otworzyć połączenie lub nawet na innej stronie (o ile serwer nie opuścił połowy stanu). Musi być możliwe, ale jak? Chciałbym zobaczyć działającą próbkę. –

+0

Wyobrażam sobie, że aby "odtworzyć" taki websocket, serwer również musiałby go wspierać. A dokładniej biblioteka używana do implementacji obsługi websocket na serwerze. Podejrzewam, że większość implementacji na serwerze zakończyłaby działanie websocket po wykryciu, że podstawowe połączenie TCP zostało zamknięte - chociaż zmiany proponowane przez klienta mogą je zachować. –

+3

Yup, ** połączenie websocket nie działa na żywo połączenie tcp utworzone jako transport **, dobrze, myślałem, że były one sprytniejsze. –

Odpowiedz

7

Odpowiedź brzmi: no.

Nawet jeśli gniazdo nie zostanie jawnie zamknięte przez wywołanie mySocket.close();, gniazdo zostanie zamknięte przez przeglądarkę przy ponownym ładowaniu.

Próbowałem przechowywać obiekt Web Socket w pamięci lokalnej i użyć go do odzyskania danych ponownie. Zwrócony obiekt jest poprawny, ale połączenie już tam nie istnieje. Ponieważ po ponownym załadowaniu strony gniazdo jest niewspółmiernie zakończone.

wiadomość na stronie serwera mówi:

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

Nie idziesz ...

+0

Byłem ciekawy, co by się stało, gdyby umieścić plik sieci Web (lub odwołać się do niego) do lokalnego magazynu. Dzięki za wypróbowanie i rozwiązanie tajemnicy. –

2

Shared Web Workers umożliwi udostępnianie połączeń WebSocket dla wielu kart załadowanych z tego samego pochodzenia/witryny.

Współdzielone Web Workers są obecnie obsługiwane tylko pod numerem Chrome, Safari, Opera.

+0

Niestety, moje pytanie nie było wystarczająco jasne. Kiedy mówiłem różne strony, powinienem był podać w tej samej karcie. Zmieniłem moje pytanie, aby miejmy nadzieję uczynić to jaśniejszym. Dzięki, że masz szansę. –

+0

@Joshua: ah, to pytasz o to samo, o co niedawno zapytałem: http://stackoverflow.com/questions/9336774/do-shared-web-workers-persist-across-a-single-page -reload-link-navigation/9337749 Nie ma jednoznacznej odpowiedzi na to pytanie, zamierzam przetestować w pewnym momencie, czy działa w Chrome/Safari. – kanaka

+0

Tak, pytania są podobne, poza tym, że miałem nadzieję, że w sieciach internetowych było coś innego, co oznaczało, że mogę uzyskać inną odpowiedź. –

7

odmienne podejście byłoby utrzymanie użytkownikowi zamiast gniazda na różnych stronach. Rozumiem przez to, że przechowujesz identyfikator klienta w ciasteczku z javascript, za każdym razem, gdy użytkownik próbuje otworzyć nowe gniazdo z którejkolwiek strony twojej strony, wysyłasz ten identyfikator na serwer, a następnie serwer ma sposób, aby wiedzieć, że to nowe połączenie pochodzi od tego samego użytkownika.

Zrobiłem to w ostatnim projekcie i działa idealnie :) W zależności od tego, co planujesz zrobić, możesz zachować stan użytkownika na swoim serwerze z jego identyfikatorem lub przechowywać go w innym pliku cookie lub użyj flash zdarzenia, aby zapisać go we współdzielonym obiekcie!

+0

Tak, jest to całkowicie możliwe i byłoby to całkowicie poprawne rozwiązanie (i takie, które omówiliśmy), ale podstawowa architektura opierała się na otwartym kluczu sieciowym w celu spełnienia niektórych wymagań funkcjonalnych. Oczywiście problemy, które mogłyby być spowodowane otwieraniem i zamykaniem gniazd, mogły zostać złagodzone, ale ostatecznie zdecydowano, że lepiej będzie zamiast tego otwierać gniazdo i dynamicznie ładować zawartość w oparciu o właściwość lokalizacji adresu URL. Nie jestem pewien, czy to lepszy sposób, ale c'est la vie. –

+0

@WiMantis którego menedżera połączeń dla websocket używasz po stronie serwera? –