Socket.IO (2011)

Socket.IO (2011)

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.

572884b36b9538ad273ef7dd7e23b228?s=128

Adam Jodłowski

July 29, 2011
Tweet

Transcript

  1. Adam Jodłowski meet.js Poznań, 29.07.2011

  2. HTTP • żądanie-odpowiedź • prostota • bezstanowość • skalowalność •

    wydajność • rozszerzalność
  3. HTTP • żądanie-odpowiedź • prostota • bezstanowość • skalowalność •

    wydajność • rozszerzalność • przyjęty standard • powszechne stosowanie
  4. HTTP • żądanie-odpowiedź • prostota • bezstanowość • skalowalność •

    wydajność • rozszerzalność • przyjęty standard • powszechne stosowanie mimo wielu zalet, nie nadaje się do wszystkiego
  5. Trzeba sobie jakoś radzić • AJAX

  6. Trzeba sobie jakoś radzić • AJAX  same origin policy

     JSONP
  7. Trzeba sobie jakoś radzić • AJAX  same origin policy

     JSONP musimy odpytywać serwer o nowe dane
  8. Trzeba sobie jakoś radzić • AJAX  same origin policy

     JSONP musimy odpytywać serwer o nowe dane • Comet a.k.a. Reverse AJAX
  9. 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
  10. 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)
  11. 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)
  12. Socket.IO mechanizm komunikacji cross-domain w czasie rzeczywistym

  13. Socket.IO mechanizm komunikacji cross-domain w czasie rzeczywistym • udostępnia API

    na wzór WebSockets
  14. 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
  15. 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
  16. Socket.IO jeden z wielu modułów do NodeJS

  17. Socket.IO jeden z wielu modułów do NodeJS • npm install

    socket.io
  18. 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
  19. Serwer var io = require('socket.io').listen(1337); io.sockets.on('connection', function(socket) { // po

    czenie klienta łą socket.on('message', function(data) { // odebranie wiadomo ci ś }); socket.on('disconnect', function() { // roz czenie klienta łą }); });
  20. Klient <head> <script src="http://server/socket.io/socket.io.js"> </script> <script> var socket = io.connect('http://server/');

    socket.on('connect', function() { // po czenie z serwerem łą socket.send(msg); // wys anie wiadomo ci ł ś socket.on('message', function(data) { // odebranie wiadomo ci ś }); }); </script> </head>
  21. Socket.IO 0.7 – co nowego? • przestrzenie nazw • zdarzenia

    (custom events) • potwierdzenia • wiadomości ulotne • grupy
  22. Przestrzenie nazw (namespaces) standardowy WebSocket pozwala na komunikację w ramach

    jednego wewnętrznego protokołu
  23. 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
  24. 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
  25. Przestrzenie nazw (serwer) var io = require('socket.io').listen(1337); var chat =

    io .of('/chat'). .on('connection', function (socket) { chat.send('someone connected'); }); var news = io .of('/news'). .on('connection', function (socket) { news.json.send({news: 'breaking news'}); });
  26. 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 ł });
  27. Zdarzenia (custom events) zdarzenia definiowane przez użytkowników zwiększają elastyczność i

    czytelność komunikacji
  28. Zdarzenia (custom events) zdarzenia definiowane przez użytkowników zwiększają elastyczność i

    czytelność komunikacji game.emit('new player', {nick: 'adamus', hp: 100});
  29. Zdarzenia (custom events) zdarzenia definiowane przez użytkowników zwiększają elastyczność i

    czytelność komunikacji game.emit('new player', {nick: 'adamus', hp: 100}); game.on('new player', function (player) { console.log(player.nick + ' connected!'); });
  30. Potwierdzenia (acknowledgements) ostatnim parametrem funkcji .send() i .emit() może być

    callback wykonywany po dostarczeniu wiadomości
  31. 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 ść ł });
  32. 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'); });
  33. 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
  34. 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)
  35. 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);
  36. Grupy obsługa grup wprowadza kolejną warstwę abstrakcji ułatwiającą kontrolę nad

    komunikacją
  37. Grupy obsługa grup wprowadza kolejną warstwę abstrakcji ułatwiającą kontrolę nad

    komunikacją typowym zastosowaniem mogą być pokoje w czacie
  38. 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!' ż ); });
  39. Przyszłość? Many exciting things are still to come.