Omówienie i demonstracja głównych koncepcji i możliwości API wersji 0.7 Socket.IO, biblioteki dostarczającej mechanizm komunikacyjny na wzór WebSockets i działającej w oparciu o node.js. Prezentacja wygłoszona na spotkaniu meet.js w Poznaniu.
HTTP ● żądanie-odpowiedź ● prostota ● bezstanowość ● skalowalność ● wydajność ● rozszerzalność ● przyjęty standard ● powszechne stosowanie mimo wielu zalet, nie nadaje się do wszystkiego
Trzeba sobie jakoś radzić ● AJAX same origin policy JSONP musimy odpytywać serwer o nowe dane ● Comet a.k.a. Reverse AJAX forever iframe long polling
WebSockets • technologia dwustronnej komunikacji sieciowej • wykorzystuje jedno gniazdko protokołu TCP • załatano krytyczne luki w bezpieczeństwie • standaryzacja w trakcie, aktualnie draft 10 (IETF, W3C)
WebSockets • technologia dwustronnej komunikacji sieciowej • wykorzystuje jedno gniazdko protokołu TCP • załatano krytyczne luki w bezpieczeństwie • standaryzacja w trakcie, aktualnie draft 10 (IETF, W3C) nawiązanie połączenia następuje poprzez HTTP (handshake) i przełączenie na protokół WS (Connection: Upgrade)
Socket.IO mechanizm komunikacji cross-domain w czasie rzeczywistym ● udostępnia API na wzór WebSockets ● wewnętrznie korzysta z różnych transportów WebSocket Adobe Flash Socket AJAX long polling AJAX multipart streaming Forever iframe JSONP polling
Socket.IO mechanizm komunikacji cross-domain w czasie rzeczywistym ● udostępnia API na wzór WebSockets ● wewnętrznie korzysta z różnych transportów WebSocket Adobe Flash Socket AJAX long polling AJAX multipart streaming Forever iframe JSONP polling ● działa w IE 5.5+, Safari 3+, Chrome 4+, Firefox 3+, Opera 10.61+, iOS Safari, Android WebKit, WebOS WebKit
Socket.IO jeden z wielu modułów do NodeJS ● npm install socket.io może współpracować z frameworkiem Express lub działać na własnym porcie jako osobny serwer
<br/> <br/>var socket = io.connect('http://server/');<br/>socket.on('connect', function() {<br/>// po czenie z serwerem<br/>łą<br/>socket.send(msg); // wys anie wiadomo ci<br/>ł ś<br/>socket.on('message', function(data) {<br/>// odebranie wiadomo ci<br/>ś<br/>});<br/>});<br/>
Przestrzenie nazw (namespaces) standardowy WebSocket pozwala na komunikację w ramach jednego wewnętrznego protokołu dla rozróżnienia rodzaju i sposobu obsługi komunikatów musimy wprowadzać dodatkowe informacje sterujące
Przestrzenie nazw (namespaces) standardowy WebSocket pozwala na komunikację w ramach jednego wewnętrznego protokołu dla rozróżnienia rodzaju i sposobu obsługi komunikatów musimy wprowadzać dodatkowe informacje sterujące multipleksacją wiadomości zajmuje się Socket.IO, serwer musi zaimplementować obsługę wielu kanałów a klient podłączyć się na dedykowane im adresy
Przestrzenie nazw (klient) var chat = io.connect('http://server:1337/chat'); var news = io.connect('http://server:1337/news'); chat.on('connect', function() { // obs uga wiadomo ci z chatu ł ś }); news.on('connect', function() { // obs uga newsów ł });
Potwierdzenia (acknowledgements) ostatnim parametrem funkcji .send() i .emit() może być callback wykonywany po dostarczeniu wiadomości socket.send('lubi placki' ę , function() { // wiadomo dotar a do adresata ść ł });
Potwierdzenia (acknowledgements) dodatkowo, korzystając z .emit() możemy odsyłać własne dane wraz z potwierdzeniem odbioru socket.emit('has o?' ł , function (pass) { console.log('received password = ' + pass); }); socket.on('has o?' ł , function (callback) { callback('qwerty'); });
Wiadomości ulotne (volatile) komunikacja w czasie rzeczywistym wymaga czasem odstąpienia od wysyłania kolejnych wiadomości w przypadku zbyt dużego obciążenia strony odbierającej
Wiadomości ulotne (volatile) komunikacja w czasie rzeczywistym wymaga czasem odstąpienia od wysyłania kolejnych wiadomości w przypadku zbyt dużego obciążenia strony odbierającej jest to szczególnie ważne w przypadku stosowania bardziej zawodnych transportów (long polling)
Wiadomości ulotne (volatile) komunikacja w czasie rzeczywistym wymaga czasem odstąpienia od wysyłania kolejnych wiadomości w przypadku zbyt dużego obciążenia strony odbierającej jest to szczególnie ważne w przypadku stosowania bardziej zawodnych transportów (long polling) socket.volatile.emit('new tweet', tweet);
Grupy obsługa grup wprowadza kolejną warstwę abstrakcji ułatwiającą kontrolę nad komunikacją typowym zastosowaniem mogą być pokoje w czacie io.sockets.on('connection', function(socket) { socket.join('js-news'); // do czenie łą // broadcast do wszystkich z mojej grupy socket.broadcast.to('js-news').send('witam!'); // do wszystkich z innej grupy io.sockets.in('ruby-news').emit(' egnam!' ż ); });