Jakie są różnice między socket.io i websockets w node.js?
Czy oba są technologiami wypychania serwerów? Jedyne różnice, które czułem, to:
gniazdo.io pozwoliło mi wysyłać / emitować wiadomości, podając nazwę zdarzenia.
W przypadku socket.io wiadomość z serwera dotrze do wszystkich klientów, ale dla tego samego w websockets byłem zmuszony zachować tablicę wszystkich połączeń i przejść przez nią pętlę, aby wysłać wiadomości do wszystkich klientów.
Zastanawiam się także, dlaczego inspektorzy sieci (np. Chrome / firebug / fiddler) nie są w stanie przechwycić tych wiadomości (z socket.io/websocket) z serwera?
Proszę to wyjaśnić.
Odpowiedzi:
Jego zalety polegają na tym, że upraszcza korzystanie z WebSockets, jak opisano w punkcie 2, i co ważniejsze, zapewnia przełączanie awaryjne na inne protokoły w przypadku, gdy WebSockets nie są obsługiwane w przeglądarce lub na serwerze. Unikałbym bezpośredniego korzystania z WebSockets, chyba że dobrze znasz środowiska, w których one nie działają i jesteś w stanie obejść te ograniczenia.
To dobry odczyt zarówno na WebSockets, jak i Socket.IO.
http://davidwalsh.name/websocket
źródło
Nieporozumienia
Istnieje kilka typowych nieporozumień dotyczących WebSocket i Socket.IO:
Pierwszym nieporozumieniem jest to, że używanie Socket.IO jest znacznie łatwiejsze niż używanie WebSocket, co nie wydaje się być prawdą. Zobacz przykłady poniżej.
Drugim nieporozumieniem jest to, że WebSocket nie jest szeroko obsługiwany w przeglądarkach. Zobacz więcej informacji.
Trzecie nieporozumienie polega na tym, że Socket.IO obniża połączenie jako awarię starszych przeglądarek. Zakłada, że przeglądarka jest stara i uruchamia połączenie AJAX z serwerem, które później jest uaktualniane w przeglądarkach obsługujących WebSocket, po wymianie ruchu. Szczegóły poniżej.
Mój eksperyment
Napisałem moduł npm, aby zademonstrować różnicę między WebSocket a Socket.IO:
Jest to prosty przykład kodu po stronie serwera i po stronie klienta - klient łączy się z serwerem za pomocą WebSocket lub Socket.IO, a serwer wysyła trzy komunikaty w odstępach 1s, które są dodawane do DOM przez klienta.
Po stronie serwera
Porównaj przykład użycia serwera WebSocket i Socket.IO do wykonania tego samego w aplikacji Express.js:
Serwer WebSocket
Przykład serwera WebSocket przy użyciu Express.js:
Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js
Serwer Socket.IO
Przykład serwera Socket.IO przy użyciu Express.js:
Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js
Strona klienta
Porównaj przykład użycia klienta WebSocket i Socket.IO do zrobienia tego samego w przeglądarce:
Klient WebSocket
Przykład klienta WebSocket z waniliowym JavaScript:
Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html
Klient Socket.IO
Przykład klienta Socket.IO przy użyciu waniliowego JavaScript:
Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html
Ruch sieciowy
Aby zobaczyć różnicę w ruchu sieciowym, możesz uruchomić mój test . Oto wyniki, które otrzymałem:
Wyniki WebSocket
2 żądania, 1,50 KB, 0,05 s
Z tych 2 wniosków:
(Żądanie aktualizacji połączenia jest widoczne w narzędziach programisty z odpowiedzią 101 Protokoły przełączające.)
Wyniki Socket.IO
6 wniosków, 181,56 KB, 0,25 s
Z tych 6 wniosków:
Zrzuty ekranu
Wyniki WebSocket, które otrzymałem na localhost:
Wyniki Socket.IO, które dostałem na localhost:
Sprawdź się
Szybki start:
Otwórz http: // localhost: 3001 / w przeglądarce, otwórz narzędzia programistyczne za pomocą Shift + Ctrl + I, otwórz kartę Sieć i ponownie załaduj stronę za pomocą Ctrl + R, aby zobaczyć ruch sieciowy dla wersji WebSocket.
Otwórz http: // localhost: 3002 / w przeglądarce, otwórz narzędzia programistyczne za pomocą Shift + Ctrl + I, otwórz kartę Sieć i ponownie załaduj stronę za pomocą Ctrl + R, aby zobaczyć ruch sieciowy dla wersji Socket.IO.
Aby odinstalować:
Kompatybilność z przeglądarkami
Od czerwca 2016 WebSocket działa na wszystkim oprócz Opery Mini, w tym IE wyższej niż 9.
Oto kompatybilność przeglądarki WebSocket w Czy mogę używać od czerwca 2016:
Aktualne informacje można znaleźć na stronie http://caniuse.com/websockets .
źródło
Zamierzam przedstawić argument przeciwko używaniu socket.io.
Myślę, że używanie socket.io tylko dlatego, że ma awarie, nie jest dobrym pomysłem. Niech IE8 RIP.
W przeszłości było wiele przypadków, w których nowe wersje NodeJS zepsuły socket.io. Możesz sprawdzić te listy w poszukiwaniu przykładów ... https://github.com/socketio/socket.io/issues?q=install+error
Jeśli zdecydujesz się stworzyć aplikację na Androida lub coś, co musi współpracować z istniejącą aplikacją, prawdopodobnie dobrze byłoby pracować z WS od razu, socket.io może sprawić ci problemy ...
Dodatkowo moduł WS dla Node.JS jest niezwykle prosty w użyciu.
źródło
Korzystanie z Socket.IO jest w zasadzie podobne do korzystania z jQuery - chcesz obsługiwać starsze przeglądarki, musisz napisać mniej kodu, a biblioteka zapewni awarie. Socket.io korzysta z technologii websockets, jeśli jest dostępna, a jeśli nie, sprawdza najlepszy dostępny rodzaj komunikacji i korzysta z niej.
źródło
Nawet jeśli współczesne przeglądarki obsługują teraz WebSockets, myślę, że nie ma potrzeby wyrzucania SocketIO i nadal ma swoje miejsce w każdym współczesnym projekcie. Łatwo to zrozumieć i osobiście nauczyłem się, jak działa WebSockets dzięki SocketIO.
Jak powiedziano w tym temacie, istnieje wiele bibliotek integracyjnych dla Angular, React itp. Oraz typów definicji dla TypeScript i innych języków programowania.
Inną kwestią, którą chciałbym dodać do różnic między Socket.io i WebSockets, jest to, że grupowanie w Socket.io nie jest wielkim problemem. Socket.io oferuje Adaptery , których można użyć do połączenia go z Redis w celu zwiększenia skalowalności. Na przykład masz ioredis i socket.io-redis .
Tak, wiem, SocketCluster istnieje, ale to nie na temat.
źródło
Socket.IO korzysta z WebSocket, a gdy WebSocket nie jest dostępny, używa rezerwowego algorytmu do nawiązywania połączeń w czasie rzeczywistym.
źródło
https://socket.io/docs/#What-Socket-IO-is-not (z moim naciskiem )
źródło