Pracuję z socket.io i node.js i do tej pory wydaje się całkiem niezły, ale nie wiem, jak wysłać wiadomość z serwera do określonego klienta, coś takiego:
client.send(message, receiverSessionId)
Ale ani metody .send()
ani nie .broadcast()
wydają się zaspokajać mojej potrzeby.
To, co znalazłem jako możliwe rozwiązanie, polega na tym, że .broadcast()
metoda przyjmuje jako drugi parametr tablicę SessionIds, do której nie wysyła komunikatu, więc mogę przekazać tablicę ze wszystkimi SessionIds podłączonymi w tym momencie do serwera, z wyjątkiem jednego Chciałbym wysłać wiadomość, ale uważam, że musi być lepsze rozwiązanie.
Jakieś pomysły?
źródło
Odpowiedź Ivo Wetzela nie wydaje się już aktualna w Socket.io 0.9.
Krótko mówiąc, musisz teraz zapisać
socket.id
i użyć,io.sockets.socket(savedSocketId).emit(...)
aby wysłać do niego wiadomości.Oto jak to działa na klastrowanym serwerze Node.js:
Najpierw musisz ustawić sklep Redis jako sklep, aby wiadomości mogły przechodzić między procesami:
Pominąłem tutaj kod grupowania, ponieważ sprawia, że jest on bardziej zagracony, ale dodawanie go jest trywialne. Po prostu dodaj wszystko do kodu roboczego. Więcej dokumentów tutaj http://nodejs.org/api/cluster.html
źródło
io.of('/mynamespace').sockets[socketID].emit(...)
(nie wiem, czy to dlatego, że używam przestrzeni nazw)io.sockets.socket(socket_id)
jest usunięty w socket.io 1.0. github.com/socketio/socket.io/issues/1618#issuecomment-46151246każde gniazdo dołącza do pokoju z identyfikatorem gniazda dla nazwy, więc możesz po prostu
docs: http://socket.io/docs/rooms-and-namespaces/#default-room
Twoje zdrowie
źródło
io.sockets.connected[socketid].emit();
. Testowane z 1.4.6.Najprostsze, najbardziej eleganckie rozwiązanie
To tak proste jak:
I to wszystko.
Ale jak? Daj mi przykład
To, czego wszyscy potrzebujemy, to w rzeczywistości pełny przykład i oto co następuje. Jest to testowane z najnowszą wersją socket.io (2.0.3), a także korzysta z nowoczesnego Javascript (z którego wszyscy powinniśmy teraz korzystać).
Przykład składa się z dwóch części: serwera i klienta. Za każdym razem, gdy klient łączy się, zaczyna otrzymywać od serwera okresowy numer sekwencyjny. Dla każdego nowego klienta uruchamiana jest nowa sekwencja, więc serwer musi śledzić ich indywidualnie. Właśnie wtedy pojawia się „Muszę wysłać wiadomość do konkretnego klienta” . Kod jest bardzo prosty do zrozumienia. Zobaczmy.
serwer
server.js
Serwer zaczyna nasłuchiwać na porcie 8000 dla połączeń przychodzących. Kiedy ktoś przybywa, dodaje nowego klienta do mapy, aby mógł śledzić swój numer sekwencyjny. Nasłuchuje również
disconnect
zdarzenia tego klienta , kiedy usunie je z mapy.Co sekundę uruchamiany jest stoper. Kiedy to nastąpi, serwer przechodzi przez mapę i wysyła wiadomość do każdego klienta z bieżącym numerem sekwencyjnym. Następnie zwiększa ją i zapisuje z powrotem na mapie. To wszystko. Bułka z masłem.
Klient
Część klienta jest jeszcze prostsza. Po prostu łączy się z serwerem i nasłuchuje
seq-num
wiadomości, drukując ją na konsoli za każdym razem, gdy przybywa.client.js
Uruchamianie przykładu
Zainstaluj wymagane biblioteki:
Uruchom serwer:
Otwórz inne okna terminali i spawnuj tyle klientów, ile chcesz, uruchamiając:
Przygotowałem także listę z pełnym kodem tutaj .
źródło
Możesz użyć
// wyślij wiadomość tylko do nadawcy-klienta
socket.emit('message', 'check this');
// lub możesz wysłać do wszystkich słuchaczy, w tym do nadawcy
io.emit('message', 'check this');
// wysyłanie do wszystkich słuchaczy oprócz nadawcy
socket.broadcast.emit('message', 'this is a message');
// lub możesz wysłać go do pokoju
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
źródło
W wersji 1.0 należy użyć:
źródło
io.sockets.connected["something"]
i jegoemit
metody.Bez względu na to, jakiej wersji używamy, po prostu console.log () obiekt „io”, którego używamy w naszym kodzie nodejs po stronie serwera, [np. Io.on ('connection', function (socket) {...});] , widzimy, że „io” jest tylko obiektem json i istnieje wiele obiektów potomnych, w których przechowywane są id gniazda i obiekty gniazda.
Używam socket.io w wersji 1.3.5, btw.
Jeśli spojrzymy na obiekt io, zawiera on,
tutaj możemy zobaczyć gniazda „B5AC9w0sYmOGWe4fAAAA” itd. Więc możemy to zrobić,
Ponownie, po dalszej inspekcji możemy zobaczyć takie segmenty,
Możemy więc stąd pobrać gniazdo
Poza tym pod silnikiem mamy
Możemy więc pisać
Myślę, że możemy osiągnąć nasz cel na jeden z 3 sposobów wymienionych powyżej,
źródło
Możesz to zrobić
Na serwerze
A na kliencie jest bardzo łatwy w obsłudze.
źródło
Począwszy od wersji 1.4.5, upewnij się, że w io.to () podałeś poprawnie przedrostek socketId. Wziąłem gniazdo, w którym klient zalogował się do debugowania, i to bez prefiksu, więc skończyłem na wyszukiwaniu, aż się dowiedziałem! Być może będziesz musiał to zrobić, jeśli identyfikator, który masz, nie jest poprzedzony:
źródło
io.sockets.sockets [socket.id] .emit (...) działał dla mnie w wersji 0.9
źródło
Możesz także zachować referencje klientów. Ale to sprawia, że twoja pamięć jest zajęta.
Utwórz pusty obiekt i ustaw w nim swoich klientów.
następnie zadzwoń do konkretnego klienta przez identyfikator z obiektu
źródło
Socket.IO umożliwia „przestrzeń nazw” gniazd, co zasadniczo oznacza przypisanie różnych punktów końcowych lub ścieżek.
Może to pomóc: http://socket.io/docs/rooms-and-namespaces/
źródło