2013-06-28 22 views
8

Mam działający przykład Websockets, gdzie klienci otrzymują wiadomości z serwera.Jak wysłać stare wiadomości za pomocą Websockets

Nie jestem pewien, w jaki sposób powinienem wysyłać stare wiadomości do klientów, gdy się łączą.

Przykład:

  • Każdy klient dostarcza swoje nazwisko, gdy łączą
  • serwer odpowie „[nazwa] właśnie podłączony” (dla wszystkich klientów)
  • Wszelkie nowi klienci nie dostać te wiadomości

Zastanawiam się, czy istnieje sposób, w jaki klienci mogą odbierać stare wiadomości (wszystkie z nich lub wiadomości w ciągu ostatnich 5 minut byłyby dopuszczalne).

Podejrzewam, że będę musiał przechwycić te informacje osobiście, przechowywać je gdzieś (jak bazę danych) i wysyłać wiadomości do nowych klientów. Czy to prawda, czy coś mi brakuje?

Jeśli ktoś ma pseudo kod lub link do przykładu tego, jak inni to zaimplementowali, byłby przydatny.

+0

Czy to nie jest tak proste, jak serwer wysyła listę aktualnie podłączonych klientów do każdego nowego klienta? – JeffRSon

+0

@JeffRSon Chcę móc wysyłać dowolne dowolne dane. –

+0

Nie jestem pewien, czy wysyłanie nieaktualnych wiadomości ma sens. Załóżmy, że klient podłączył się i rozłączył. Czy wyślesz obie wiadomości do dowolnego nowego klienta? Czy wiesz, że rozłączona wiadomość musi "usunąć" poprzednią połączoną wiadomość? Jeśli nie jest to rejestrowanie, należy wysyłać tylko bieżący stan. A do logowania musisz zachować całą masę wiadomości, aby je wysłać - jednak tylko raz, oczywiście. – JeffRSon

Odpowiedz

4

Będziesz musiał go przechwycić i przechowywać na serwerze ... po nawiązaniu połączenia będziesz musiał nazwać te dane wszystkim połączonym klientom oraz wiadomości, które zostały zapisane do użytkownika, który się połączył. Tak więc, będziesz musiał kodować transmisję danych do użytkowników:

Przy okazji, czego używasz po stronie serwera? (Node, Erlang, etc)

Można sprawdzić poniższy link, jeśli używasz node.js

http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial

+0

Gah. To irytujące. Miałem nadzieję, że uniknę tego, znajdując jakąś super fajną "kolejkę wiadomości" ukrytą w implementacji Websocket. Tak, używam węzła. –

+0

:) Zaimplementowano "super kolejkę komunikatów". Jeśli jednak chcesz zaimplementować kolejkę komunikatów jako prostą, możesz łatwo użyć RabbitMQ lub innej kolejki komunikatów .. –

+0

Czy byłoby to możliwe tutaj: http://stackoverflow.com/questions/26056688/get-past-messages-from-websocket –

2

Można zrobić coś takiego:

  1. Każda wiadomość powinna mieć id ->muid (Wiadomość Niepowtarzalna identyfikacja)
  2. Za każdym razem, gdy klient wysyła wiadomość sa, robi się ACK z serwera wraz z muid dla wysłanej wiadomości.
  3. Za każdym razem, gdy nowa wiadomość jest odbierana po stronie serwera, przypisuje się mu muid, wysłany wraz z ACK, a także wysłany wraz z komunikatem do każdego podłączonego użytkownika. W ten sposób widok będzie mógł przedstawić, dla każdego użytkownika, tę samą sekwencję w pewnym momencie czasu.
  4. Za każdym razem, gdy nowy użytkownik łączy się, wysyła ostatni muid, który otrzymał, aby serwer wiedział, gdzie ten użytkownik przestał odbierać wiadomości. Serwer może następnie wysłać jak najwięcej starych wiadomości, jak chcesz, w zależności od rodzaju pamięci masz realizacji:
    1. Pełna historia: Polecam przechowywanie baz danych z właściwego indeksowania
    2. Wiadomości Najnowsza N: W zależności od wielkości N możesz po prostu przechowywać ostatnie N wiadomości w ustalonym rozmiarze i wysyłać je, wszystkie lub potrzebne fragmenty, przy każdym ponownym połączeniu. Należy pamiętać, że zajmie to pamięć, więc przechowywanie 1024 ostatnich wiadomości w 1024 różnych czatach spożywałoby sporą ilość pamięci, zwłaszcza jeśli wiadomości mają nieograniczony rozmiar.

Nadzieja pomaga

Powiązane problemy