Top Banner
MAKE WEB REAL RealTime Socket.io Caesar Chi http://about.me/clonn Saturday, April 19, 14
54
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Node realtime part

MAKE WEB REALRealTime Socket.io

Caesar Chihttp://about.me/clonn

Saturday, April 19, 14

Page 2: Node realtime part

Caesar Chi

clonncdSaturday, April 19, 14

Page 3: Node realtime part

http://www.flickr.com/photos/kent-chen/6612953485/sizes/l/in/photostream/Saturday, April 19, 14

Page 4: Node realtime part

REAL TIME?

Saturday, April 19, 14

Page 5: Node realtime part

Saturday, April 19, 14

Page 6: Node realtime part

考慮?

Saturday, April 19, 14

Page 7: Node realtime part

http://www.flickr.com/photos/goldentime/4089413847/sizes/z/in/photostream/

Saturday, April 19, 14

Page 8: Node realtime part

效能

Saturday, April 19, 14

Page 9: Node realtime part

Saturday, April 19, 14

Page 10: Node realtime part

開發成本Saturday, April 19, 14

Page 11: Node realtime part

Saturday, April 19, 14

Page 12: Node realtime part

http://socket.io/

Saturday, April 19, 14

Page 13: Node realtime part

socket.ioinstall

Saturday, April 19, 14

Page 14: Node realtime part

•Socket.io

•Socket.io-client

Saturday, April 19, 14

Page 15: Node realtime part

Saturday, April 19, 14

Page 16: Node realtime part

•Chrome

•FireFox

•IE

•MobileSaturday, April 19, 14

Page 17: Node realtime part

• WebSocket

• Adobe® Flash® Socket

• AJAX long polling

• AJAX multipart streaming

• Forever Iframe

• JSONP Polling

Saturday, April 19, 14

Page 18: Node realtime part

Simple Codehttps://gist.github.com/4049817

Saturday, April 19, 14

Page 19: Node realtime part

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {  socket.emit('news', { hello: 'world' });   socket.on('my other event', function (data) {    console.log(data);  }); });

 var socket = io.connect();  socket.on('news', function (data) {    console.log(data);    socket.emit('my other event', { my: 'data' });  });

Saturday, April 19, 14

Page 20: Node realtime part

var  app  =  require('http').createServer(handler)    ,  io  =  require('socket.io').listen(app)    ,  fs  =  require('fs')

var  socketio  =  require('socket.io'),        io;

function  handler  (req,  res)  {    fs.readFile(__dirname  +  '/index.html',    function  (err,  data)  {        if  (err)  {            res.writeHead(500);            return  res.end('Error  loading  index.html');        }      

       res.writeHead(200);        res.end(data);    });  }

Saturday, April 19, 14

Page 21: Node realtime part

反饋式修改

Saturday, April 19, 14

Page 22: Node realtime part

with Express

Saturday, April 19, 14

Page 23: Node realtime part

server  =  http.createServer(app);server.listen(app.get('port'),  function(){    console.log("Express  server  listening  on  port  "  +  app.get('port'));});

require('./io.server').io(server);

<script  type="text/javascript"  src="/socket.io/socket.io.js"></script><script  src="/javascripts/io.client.js"></script>

Saturday, April 19, 14

Page 24: Node realtime part

var  socketio  =  require('socket.io'),        io;

exports.io  =  function  (server)  {

   io  =  socketio.listen(server);

   io.sockets.on('connection',  function  (socket)  {        socket.emit('init',  {            id:  socket.id        });    });};

Saturday, April 19, 14

Page 25: Node realtime part

 var  socket  =  io.connect(),

 socket.on('init',  function  (data)  {      concole.log(data);  });

Saturday, April 19, 14

Page 26: Node realtime part

廣播事件

Saturday, April 19, 14

Page 27: Node realtime part

io.sockets.on('connection', function (socket) { socket.broadcast.emit('user connected');});

廣播事件(沒有自己)

Saturday, April 19, 14

Page 28: Node realtime part

Saturday, April 19, 14

Page 29: Node realtime part

Saturday, April 19, 14

Page 30: Node realtime part

io.sockets.on('connection', function (socket) { io.sockets.emit('user connected');});

廣播事件(有自己)

Saturday, April 19, 14

Page 31: Node realtime part

Saturday, April 19, 14

Page 32: Node realtime part

Saturday, April 19, 14

Page 33: Node realtime part

Saturday, April 19, 14

Page 35: Node realtime part

io.configure('production',  function(){    io.enable('browser  client  etag');    io.set('log  level',  1);

   io.set('transports',  [        'websocket'    ,  'flashsocket'    ,  'htmlfile'    ,  'xhr-­‐polling'    ,  'jsonp-­‐polling'    ]);});

io.configure('development',  function(){    io.set('transports',  ['websocket']);});

Saturday, April 19, 14

Page 36: Node realtime part

io.configure('production',  function(){    io.enable('browser  client  etag');    io.set('log  level',  1);

   io.set('transports',  [        'websocket'    ,  'flashsocket'    ,  'htmlfile'    ,  'xhr-­‐polling'    ,  'jsonp-­‐polling'    ]);});

io.configure('development',  function(){    io.set('transports',  ['websocket']);});

NODE_ENV=production  node  app.js

Saturday, April 19, 14

Page 37: Node realtime part

io.configure('production',  function(){    io.enable('browser  client  etag');    io.set('log  level',  1);

   io.set('transports',  [        'websocket'    ,  'flashsocket'    ,  'htmlfile'    ,  'xhr-­‐polling'    ,  'jsonp-­‐polling'    ]);});

io.configure('development',  function(){    io.set('transports',  ['websocket']);});

NODE_ENV=production  node  app.js

NODE_ENV=development  node  app.js

Saturday, April 19, 14

Page 38: Node realtime part

例如

Saturday, April 19, 14

Page 39: Node realtime part

// assuming io is the Socket.IO server objectio.configure(function () { io.set("transports", ["xhr-polling"]); io.set("polling duration", 10); });

Saturday, April 19, 14

Page 40: Node realtime part

授權設定https://github.com/LearnBoost/socket.io/wiki/Authorizing

Saturday, April 19, 14

Page 41: Node realtime part

handshakeSaturday, April 19, 14

Page 42: Node realtime part

CookieSaturday, April 19, 14

Page 43: Node realtime part

{      headers:  req.headers              //  <Object>  the  headers  of  the  request  ,  time:  (new  Date)  +''              //  <String>  date  time  of  the  connection  ,  address:  socket.address()    //  <Object>  remoteAddress  and  remotePort  object  ,  xdomain:  !!headers.origin    //  <Boolean>  was  it  a  cross  domain  request?  ,  secure:  socket.secure            //  <Boolean>  https  connection  ,  issued:  +date                            //  <Number>  EPOCH  of  when  the  handshake  was  created  ,  url:  request.url                    //  <String>  the  entrance  path  of  the  request  ,  query:  data.query                    //  <Object>  the  result  of  url.parse().query  or  a  empty  object}

Saturday, April 19, 14

Page 44: Node realtime part

驗證、串接資料

Saturday, April 19, 14

Page 45: Node realtime part

var  io  =  require('socket.io').listen(80);

io.configure(function  (){

   io.set('authorization',  function  (handshakeData,  callback)  {                handshakeData.userData  =  {                        ‘name’:  ‘Caesar’,                        ‘age’:  18                };                callback(null,  true);  //  error  first  callback  style      });

});

接上 User Connection

Saturday, April 19, 14

Page 46: Node realtime part

io.sockets.on('connection',  function  (socket)  {        

console.log(socket.handshake.userData);});

User Data 取得

Saturday, April 19, 14

Page 47: Node realtime part

NODE 到底是什麼?

Saturday, April 19, 14

Page 48: Node realtime part

Saturday, April 19, 14

Page 49: Node realtime part

Saturday, April 19, 14

Page 50: Node realtime part

Saturday, April 19, 14

Page 51: Node realtime part

Saturday, April 19, 14

Page 52: Node realtime part

Saturday, April 19, 14

Page 54: Node realtime part

https://gist.github.com/4049817https://github.com/clonn/socket-serverhttps://github.com/clonn/comet-todo-list

Saturday, April 19, 14